2011-04-01 29 views
1

我有一个表的形式为:分组值成周的ADATE响起使用LINQ to SQL或纯SQL

StartDate[date], EndDate[date], HoursPerWeek[int] 

,并填充有点像这样:

StartDate | EndDate | HoursPerWeek 
01/01/2010 | 31/12/2010 | 37 
01/01/2010 | 31/03/2010 | 16 
05/03/2010 | 31/10/2010 | 9 

我需要制作的是一个表格,它可以逐周分析给定日期范围内工作的小时数。

理想情况下,我会这样做在LINQ到SQL,但如果我需要调用存储过程,那很好。我还没有真正知道如何去实现这一点。

我该如何开始使用?

UPDATE

我已经结束了写这个作为一个存储过程,它的工作原理,但我的眼睛是不是一个漂亮的解决方案。

CREATE PROCEDURE prcGetHoursWorked 
(
    @StartDate DATE, 
    @EndDate DATE 
) 
AS 

CREATE TABLE #Results 
(
    WeekStart DATE, 
    TotalHours INT 
) 

DECLARE @WeekOffset INT 
DECLARE @FirstDayOfStartWeek DATE 
DECLARE @HoursThisWeek INT 

SET @WeekOffset = 0 
SET @FirstDayOfStartWeek = dbo.fnc_StartOfWeek(@StartDate, 2); 

WHILE (DATEDIFF(wk, @StartDate, @EndDate) > @WeekOffset) 
BEGIN 
    SELECT @HoursThisWeek = SUM(HoursPerWeek) FROM StaffCost 
    WHERE NOT (
       Start> DATEADD(wk, @WeekOffset + 1, @FirstDayOfStartWeek) 
       OR 
       [End] < DATEADD(wk, @WeekOffset, @FirstDayOfStartWeek) 
      ) 

    INSERT INTO #Results 
    VALUES(DATEADD(wk, @WeekOffset, @FirstDayOfStartWeek), @HoursThisWeek) 

    SET @WeekOffset = @WeekOffset + 1 
END 

SELECT * FROM #Results 

是否有可能做到这一点作为基于集的操作,或者更好还是直接从LINQ到SQL?

+0

有两行具有相同的开始日期,将永远如此吗? – 2011-04-01 11:39:44

+0

而且你的样本日期范围不是独家! – 2011-04-01 12:01:53

+0

范围可以是任何东西,有时会发生冲突,它们可以在任何日期开始和结束。每行代表一个员工(某种)的预期工作时间。 – ilivewithian 2011-04-01 15:30:37

回答

0

我不知道我是否理解你期望输出的样子。但我会尽量不让这阻止我提供建议。

如果您构建日历表,这样的查询通常很容易表达。但是你正在寻找的可能不是。 (见下文)

select c.cal_date as week_end, c.iso_year, c.iso_week, 
     sum(hoursperweek) as hours_this_week 
from st 
inner join calendar c on (c.cal_date >= startdate and 
          c.cal_date <= enddate and 
          c.day_of_week = 'Sun') 
group by week_end, iso_year, iso_week 
order by week_end 

继承人的部分输出。我修剪它。

week_end  iso_year iso_week hours_this_week 
-- 
2010-01-03 2009  53  53 
... 
2010-02-21 2010  7  53 
2010-02-28 2010  8  53 
2010-03-07 2010  9  62 
2010-03-14 2010  10  62 
2010-03-21 2010  11  62 
2010-03-28 2010  12  62 
2010-04-04 2010  13  46 
2010-04-11 2010  14  46 
... 

我以前在SO上发布过code for a basic calendar table(PostgreSQL语法)。它不包括ISO周和年。如果你愿意,我会在稍后发布完整的代码。请让我知道。

两件事情该查询没有做

它不会尝试计算按比例小时。例如,示例输入的最后一行的开始日期为2010-03-05。该日期属于ISO第9周,从2010-03-01到2010-03-07;我写的查询不会计算ISO第9周9小时的3/7。

它不与日历对齐。 ISO周数对我来说很方便,因为它们已经在我的日历表中。如果您构建自己的日历表,则可以按照自己喜欢的方式定义它们。