Заполните Времена между датами, это можно сделать без рекурсивного - PullRequest
0 голосов
/ 11 мая 2019

Приведенный ниже код дает мне правильный результат, но в sql это можно сделать без рекурсивного cte?Может быть, крест применяется.

declare @t table
(locationID int,
 StartTime datetime,
 EndTime datetime
)

 insert @t
 values (1,'1900-01-01 08:00','1900-01-01 19:30')
 ;
 insert @t
 values (2,'1900-01-01 10:00','1900-01-01 15:00')
 ;
 insert @t
 values (3,'1900-01-01 09:30','1900-01-01 21:00')
 ;
with cte_t
as
(
  select locationID, StartTime, EndTime, StartTime as [Time]
  from @t
 union all
  select locationID, StartTime, EndTime, dateadd(mi,30,[Time]) as [Time]
  from cte_t
  where [Time] < [EndTime]
)

select * from cte_t order by locationID

1 Ответ

0 голосов
/ 11 мая 2019
with sample_data_table
as
(
    select locationID,cast(StartTime as datetime) as StartTime,cast(EndTime as datetime) EndTime
    from (values (1,'1900-01-01 08:00','1900-01-01 19:30')
                ,(2,'1900-01-01 10:00','1900-01-01 15:00')
                ,(3,'1900-01-01 09:30','1900-01-01 21:00')
    ) t(locationID,StartTime,EndTime)
)

, cte_times AS
(
 SELECT  TOP ((DATEDIFF(HOUR , cast('19000101' as datetime), cast('19000102' as datetime))*2))
 ROW_NUMBER() OVER (ORDER BY number) AS rownum,
 DATEADD(minute, (ROW_NUMBER() OVER (ORDER BY number) -1)*30, cast('19000101' as datetime)) AS dt
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' 
)

 select a.*, b.*
 from sample_data_table as a
 inner join cte_times as b on a.StartTime <= b.dt and a.EndTime >= b.dt
 order by a.locationID,b.dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...