2017-10-12 97 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