在SQL中迭代日期

前端之家收集整理的这篇文章主要介绍了在SQL中迭代日期前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_1@我有一个看起来有点像这样的数据表:
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))

猜你在找的MsSQL相关文章