SQL Server , split a time duration row by 24 hour period

前端 未结 3 427
野的像风
野的像风 2020-12-03 14:37

I\'m working on sql server 2008 r2. I\'m trying to split a row by 24 hours period ranges between FromDate, Todate. For example, if a time r

3条回答
  •  被撕碎了的回忆
    2020-12-03 15:25

    http://sqlfiddle.com/#!6/36452/2

    This should be what you need. The first part of the query is a recursive CTE. This can be used to create the dates-data.

    WITH CTEDays AS
    (
        SELECT CONVERT(date, '20140301') datevalue
     UNION ALL
        SELECT DATEADD(day, 1, C.datevalue)
        FROM CTEDays C
        WHERE DATEADD(day, 1, C.datevalue) <= '20140501'
    )
    SELECT 
        R.FromDate [FromOriginal]
        , R.ToDate [ToOriginal]
        , CDays.datevalue [RawDate]
        , WantedFrom = 
            CASE WHEN CONVERT(date, R.FromDate) = CDays.datevalue THEN R.FromDate
                 ELSE CDays.datevalue
            END
        , WantedTo = 
            CASE WHEN CONVERT(date, R.ToDate) = CDays.datevalue THEN R.ToDate
                 ELSE DATEADD(minute, 24*60-1, CONVERT(datetime, CDays.datevalue))
            END
    FROM 
        tblRange R
        OUTER APPLY
        (
            SELECT C.datevalue
            FROM CTEDays C
            WHERE C.datevalue BETWEEN CONVERT(date, R.FromDate) AND CONVERT(date, R.ToDate)
        ) CDays
    

    However, I would suggest to set up a calendar table for this, if the CTE is too slow or inconvenient.

    (as I have suggested here)

提交回复
热议问题