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
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)