Since my head was already in this solution I took the 2000 example I did (TKizer called it TG1) and modified to use your structure. In case you haven't come accoss this concept before, many solutions that involve generating rows use a "numbers" table or "tally" table. It is simply a pre-existing table usually a single integer value set as a clustered index. In this example the numbers table is a table variable.set nocount on--Set up your Tableset dateformat 'dmy'declare @t table ([id] int, [start] datetime, [end] datetime)insert @t select 1,'01/01/08 13:00:00', '03/01/08 13:00:00'--set up a table of Integers (starting with 0)declare @numbers table (number int)insert @numbers select number from master..spt_values where type = 'p'select d.id ,case when n.number = 0 then d.[start] else dateadd(day, n.number, dateadd(day, datediff(day, 0, d.[start]), 0)) end as [start] ,case when d.SplitCount = 0 then [end] when n.number = 0 then dateadd(minute, datediff(minute, d.[start], d.startDayEnd)-1, d.[start]) when n.number < d.SplitCount then dateadd(minute, n.number*1439, d.startDayEnd) else d.[end] end as [end]from ( select t.id ,t.[start] ,t.[end] ,dateadd(day, 1, datediff(day, 0, t.[start])) startDayEnd ,dateadd(day, 0, datediff(day, 0, t.[end])) endDayStart ,datediff(day, t.[start], t.[end]) SplitCount from @t t ) dinner join @numbers n on n.number <= d.SplitCountOUTPUT:id start end----------- ----------------------- -----------------------1 2008-01-01 13:00:00.000 2008-01-01 23:59:00.0001 2008-01-02 00:00:00.000 2008-01-02 23:59:00.0001 2008-01-03 00:00:00.000 2008-01-03 13:00:00.000
Be One with the OptimizerTG