2013-03-06 30 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 

从那里我觉得应该是非常容易的,你得到你正在寻找的准确输出。