差距在两个不同细胞的两个日期之间

时间:2015-03-27 17:20:21

标签: sql-server

我需要帮助来创建一个我遇到困难的脚本。

MemberId    BeginDate   EndDate Output  
1039725910  3/1/2014    8/10/2014   0   End on 10th August
1039725910  8/11/2014   11/10/2014  1   Start on 11th August, 1 day gap
1039725910  11/11/2014  12/31/2014  1   Start on 11th August, 1 day gap
1166164140  1/1/2014    4/30/2039   0   End on 30 April
1166164140  2/5/2014    12/30/2039  2   Start on 1st May, Here is a 2 days gap

这里对于一个成员,我有三个不同的开始和结束日期。对于每个成员的第一个记录,它将为0,对于第二个记录,差距将是(第二个Begindate - 第一个EndDate)。对于第3条记录,差异将是(第3个开始日期 - 第2个EndDate)依此类推......我无法附加任何屏幕截图。

请帮助我。

此致 拉坦

2 个答案:

答案 0 :(得分:0)

您可以使用ROW_NUMBER()

尝试使用如下所示的查询:

select *,
case when rno = 1 then 0
else  datediff(day, begindate,enddate) end as difference
 from 
(select *, row_number() over (partition by MemberId order by MemberId) as rno   from members)
tbl

检查以下演示代码:

SQLFiddle Demo

答案 1 :(得分:0)

您可以将row_number()窗口函数与自联接一起使用,以访问由MemberId分区的上一行,如下所示:

select 
    a.MemberId, 
    a.BeginDate, 
    a.EndDate,
    Output = ISNULL(DATEDIFF(DAY, isnull(b.EndDate, a.BeginDate), a.BeginDate), 0) 
from 
    (select *, rn = ROW_NUMBER() over (partition by memberid order by begindate) from members) a
left join 
    (select *, rn = ROW_NUMBER() over (partition by memberid order by begindate) from members) b
on a.MemberId = b.MemberId and a.rn - 1 = b.rn

使用您的示例数据,这将为您提供:

MemberId    BeginDate   EndDate     Output
1039725910  2014-03-01  2014-08-10  0
1039725910  2014-08-11  2014-11-10  1
1039725910  2014-11-11  2014-12-31  1
1166164140  2014-01-01  2039-04-30  0
1166164140  2014-05-02  2039-12-30  -9129

如果您需要忽略年份组件,则必须进行日期算术。