从SQL Server中选择期间

时间:2014-09-29 16:00:04

标签: sql sql-server gaps-and-islands

我有一个包含datetime和flag的表,如下所示:

2014-11-06 | True
2014-11-07 | True
2014-11-08 | True
2014-11-09 | False
2014-11-10 | False
2014-11-11 | True
2014-11-12 | True
2014-11-13 | False
2014-11-14 | True
2014-11-15 | False

我需要一个SQL查询的帮助,该查询返回每个True期间的最小和最大日期,如下所示:

2014-11-06 | 2014-11-08
2014-11-11 | 2014-11-12
2014-11-14 | 2014-11-14

请帮忙。它可以是LinqToSql查询或T-SQL。感谢

2 个答案:

答案 0 :(得分:3)

" true"的连续时间段有一个不错的财产。如果从日期中减去不断增加的数字序列,则组中的所有内容都将具有相同的日期。您可以应用此逻辑:

select min(dt), max(dt)
from (select dt,
             (dt - row_number() over (order by dt) ) as grp
      from table t
      where flag = true
     ) t
group by grp;

答案 1 :(得分:0)

我喜欢以下方法,但如果您的数据集中缺少日期,那么它将无效。 我试过这个,可能对有这种数据集的人有用。

Select Min(dt), Max(dt) 
from (Select dt, r_num, 
            (r_num - row_number() over(order by r_num)) as grp
      From ( select dt,flag, 
                    row_number() over(Order by dt) r_num
              From table t ) x
      Where flag = 'true'
     ) t
group by grp