我有一个看起来有点像这样的数据表:
Name StartTime FinishTime Work Bob 2010-08-03 08:00:00 2010-08-03 12:00:00 4 Bob 2010-08-03 13:00:00 2010-08-03 16:00:00 3 Pete 2010-08-04 08:00:00 2010-08-04 12:00:00 4 Mark 2010-08-04 10:00:00 2010-08-04 12:00:00 2
这些日期范围都不应超过午夜.
我想写一个sql,它会给我以下输出,给定输入开始日期为2010-08-02,结束日期为2010-08-05
Date Name TotalWork 2010-08-03 Bob 7 2010-08-03 Pete 3 2010-08-04 Pete 4 2010-08-04 Mark 2
我可以忍受,实际上可能最终需要,任何没有相关工作的日子也会在结果集中表示,可能像这样一行:
2010-08-05 NULL 0
我不太确定如何以与使用其他语言相同的方式迭代sql中的日期.
为了给出这个上下文,它的输出最终会插入Stacked Chart .Net控件.
有人可以给我一个线索,教程链接或其他一些帮助吗?否则我想我会在这几天摆弄这个!
谢谢!
乔纳森
解决方法
试试这个:
Select DateAdd(day,DateDiff(day,StartDate)) Date,Name,Sum (Work) TotalWork From TableData Group By Name,DateAdd(day,StartDate))
让失踪的日子变得更难.
Declare @SD DateTime,@ED DateTime -- StartDate and EndDate variables Select @SD = DateAdd(day,Min(StartDate))),@ED = DateAdd(day,Max(StartDate))) From TableData Declare @Ds Table (aDate SmallDateTime) While @SD <= @ED Begin Insert @Ds(aDate ) Values @SD Set @SD = @SD + 1 End -- ---------------------------------------------------- Select DateAdd(day,td.StartDate)) Date,td.Name,Sum (td.Work) TotalWork From @Ds ds Left Join TableData td On DateAdd(day,tD.StartDate)) = ds.aDate Group By Name,tD.StartDate))
编辑,我正在重新审视使用公用表表达式(CTE)的解决方案.这不需要使用日期表.
Declare @SD DateTime,@ED DateTime Declare @count integer = datediff(day,@SD,@ED) With Ints(i) As (Select 0 Union All Select i + 1 From Ints Where i < @count ) Select DateAdd(day,Sum (td.Work) TotalWork From Ints i Left Join TableData d On DateDiff(day,d.StartDate) = i.i Group By d.Name,d.StartDate))