2013-03-06 60 views
1

顯示缺失值[日期]作爲範圍I具有輸出如下爲了從日期列

ID  Date 
Null 2012-10-01 
1  2012-10-02 
2  2012-10-03 
NULL 2012-10-04 
3  2012-10-05 
NULL 2012-10-06 
4  2012-10-07 
NULL 2012-10-08 
5  2012-10-10 
NULL 2012-10-11 
NULL 2012-10-12 
6  2012-10-13 
NULL 2012-10-16 

因爲已經缺少的日​​期與值作爲NULL。我需要顯示的最終輸出

2012-10-01 - 2012-10-01 (1 day) 
2012-10-04 - 2012-10-04(1 day) 
2012-10-06 - 2012-10-06(1 day) 
2012-10-08 - 2012-10-08(1 day) 
2012-10-11 - 2012-10-12(2 day) 
2012-10-14 - 2012-10-14(1 day) 
+0

[你有什麼嘗試?](http://www.whathaveyoutried.com/)請參閱[問問建議](http://stackoverflow.com/questions/ask-advice)。 – 2013-03-06 17:35:55

+0

所以你想要連續日期範圍(按日期排序)**空ID值字段**值,對吧? – 2013-03-06 17:44:33

回答

0

您可以通過下面的查詢生成日期範圍:

select 
    min(date) as start, 
    max(date) as end, 
    datediff(max(date), min(date)) + 1 as numDays 
from 
    (select @curRow := @curRow + 1 AS row_number, id, date 
    from Table1 join (SELECT @curRow := 0) r where ID is null) T 
group by 
    datediff(date, '2012-10-01 00:00:00') - row_number; 

的邏輯是基於一個聰明的把戲分組連續範圍。首先,我們過濾並編號子查詢中的行。然後,通過比較2012-10-01到行號後的天數,找到組合在一起的行。如果有任何行共享此值,那麼它們必須是連續的,否則兩行之間會出現「跳轉」,並且表達式datediff(date, '2012-10-01 00:00:00') - row_number將不再匹配。

樣本輸出(DEMO):

START       END        NUMDAYS 
October, 01 2012 00:00:00+0000 October, 01 2012 00:00:00+0000 1 
October, 04 2012 00:00:00+0000 October, 04 2012 00:00:00+0000 1 
October, 06 2012 00:00:00+0000 October, 06 2012 00:00:00+0000 1 
October, 08 2012 00:00:00+0000 October, 08 2012 00:00:00+0000 1 
October, 11 2012 00:00:00+0000 October, 12 2012 00:00:00+0000 2 
October, 16 2012 00:00:00+0000 October, 16 2012 00:00:00+0000 1 

從那裏我覺得應該是非常容易的,你得到你正在尋找的準確輸出。