Merge overlapping date intervals

后端 未结 7 1000
不知归路
不知归路 2020-11-27 16:16

Is there a better way of merging overlapping date intervals?
The solution I came up with is so simple that now I wonder if someone else has a better idea of how this cou

7条回答
  •  误落风尘
    2020-11-27 17:02

    In this solution, I created a temporary Calendar table which stores a value for every day across a range. This type of table can be made static. In addition, I'm only storing 400 some odd dates starting with 2009-12-31. Obviously, if your dates span a larger range, you would need more values.

    In addition, this solution will only work with SQL Server 2005+ in that I'm using a CTE.

    With Calendar As
        (
        Select DateAdd(d, ROW_NUMBER() OVER ( ORDER BY s1.object_id ), '1900-01-01') As [Date]
        From sys.columns as s1
            Cross Join sys.columns as s2
        )
        , StopDates As
        (
        Select C.[Date]
        From Calendar As C
            Left Join @T As T
                On C.[Date] Between T.d1 And T.d2
        Where C.[Date] >= ( Select Min(T2.d1) From @T As T2 )
            And C.[Date] <= ( Select Max(T2.d2) From @T As T2 )
            And T.d1 Is Null
        )
        , StopDatesInUse As
        (
        Select D1.[Date]
        From StopDates As D1
            Left Join StopDates As D2
                On D1.[Date] = DateAdd(d,1,D2.Date)
        Where D2.[Date] Is Null
        )
        , DataWithEariestStopDate As 
        (
        Select *
        , (Select Min(SD2.[Date])
            From StopDatesInUse As SD2
            Where T.d2 < SD2.[Date] ) As StopDate
        From @T As T
        )
    Select Min(d1), Max(d2)
    From DataWithEariestStopDate
    Group By StopDate
    Order By Min(d1)
    

    EDIT The problem with using dates in 2009 has nothing to do with the final query. The problem is that the Calendar table is not big enough. I started the Calendar table at 2009-12-31. I have revised it start at 1900-01-01.

提交回复
热议问题