加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 数据库 > MsSql > 正文

在SQL中迭代日期

发布时间:2021-03-30 23:16:45 所属栏目:MsSql 来源:互联网
导读:我有一个看起来有点像这样的数据表: Name StartTime FinishTime WorkBob 2010-08-03 08:00:00 2010-08-03 12:00:00 4Bob 2010-08-03 13:00:00 2010-08-03 16:00:00 3Pete

我有一个看起来有点像这样的数据表:

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))

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读