删除重叠日期并在SQL中排列日期

时间:2016-06-21 12:35:37

标签: sql sql-server stored-procedures

我有一张包含以下数据的表

Start       End         
=====       ===         
12/21/2011  12/20/2012   
05/05/2012  10/20/2013
12/21/2012  12/20/2013   
12/21/2013  12/20/2014
12/21/2014  12/20/2015 

想获得以下结果

Start       End        
=====       ===        
12/21/2011  05/04/2012 
05/05/2012  10/20/2013
10/21/2013  12/20/2013
12/21/2013  12/20/2014
12/21/2014  12/20/2015

关于从哪里开始的任何想法?我所做的很多阅读建议我需要创建条目,并且每一天都要创建一次条目并删除重叠日期并相应地管理日期。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为这种问题在某种程序方法中更好地解决,也是为了便于阅读。尽管如此,为了好玩,我想出了一个SQL语句,它借助rownum语句完成了这个技巧(在Oracle语法中,因为我手头没有sql-server数据库):

我们假设您的表名为DATE_TABLE,其中包含START_DATE列和END_DATE列。然后声明如下:

select start_date,
       coalesce(
          (select case when tbl_inner.start_date < tbl_outer.end_date
                       then tbl_inner.start_date - 1
                       else tbl_outer.end_date end
           from   (select rownum row_num, start_date, end_date from date_table order by 1) tbl_inner
           where tbl_inner.row_num = tbl_outer.row_num + 1),
           tbl_outer.end_date)
from   (select rownum row_num, start_date, end_date from date_table order by 1) tbl_outer;

内部选择提供表DATE_TABLE的行,其行号可由外部选择引用。如果没有COALESCE子句,该语句将不适用于DATE_TABLE中的最后一行。

我认为该陈述不能很好地扩展。