2017-10-12 90 views
3

我有一个表,看起来像如下获取日期范围在SQL

Price | DateTime 
--------+------------- 
100  | 22/01/2016 
210  | 23/01/2016 
110  | 24/01/2016 
10  | 25/01/2016 
20  | 26/01/2016 

30  | 13/03/2016 
40  | 14/03/2016 
50  | 15/03/2016 
60  | 16/03/2016 

现在,我们可以看到有两个日期范围在它:

  1. 22/01/2016 - > 26/01/2016
  2. 13/03/2016 - > 16/032016

我如何查询我的数据库来获得上述结果,即数据范围,我有 描述?数据可以按日期排序,但如何获得范围

+0

先定义一个日期范围。如果周日有空隙,日期范围是否中断? –

+0

是的,即使它的星期天它会被认为是差距,差距的门槛也是一天 –

+0

什么版本的SQL Server? –

回答

5

您的范围似乎是由连续日期定义的。您可以通过减去越来越多的数字来分配组 - 通过row_number()。剩下的就是聚合:

select min(datetime) as range_start, max(datetime) as range_end 
from (select t.*, 
      dateadd(day, - row_number() over (order by datetime), datetime) as grp 
     from t 
    ) t 
group by grp; 
+0

这是非常整洁,但依赖日期是一个独特的关键?如果在一个范围内有相同日期的两行,那么它将分成两个日期范围。也许按日期时间添加一个组会很有用 - 如果这是当然的要求。 – JohnRC

+0

@JohnRC。 。 。如果有重复日期,则使用'dense_rank()'而不是'row_number()'。 –

+0

这太好了 - 我以前没有见过'dense_rank()' - 非常有用:) – JohnRC