Использование spt_values
получить 24 часов, а затем присоединиться к таблице, чтобы получить каждые часы минуты, наконец шарниром 24 колонн.
with hours as
(
select number as hour
from master..spt_values
where number between 0 and 23 AND TYPE='P'
),
your_table as
(
select convert(datetime , '2014-11-19 00:00:00.000') as start_dt
,convert(datetime , '2014-11-19 23:59:00.000') as end_dt
union
select convert(datetime , '2014-11-19 20:00:00.000') as start_dt
,convert(datetime , '2014-11-20 19:59:00.000') as end_dt
),
minutes as
(
select
t.start_dt,t.end_dt,h.hour,
case
when datepart(hour,t.start_dt)=datepart(hour,t.end_dt)
then datepart(MINUTE,t.end_dt)-datepart(MINUTE,t.end_dt)
when datepart(hour,t.start_dt) = h.hour
then 60 - datepart(MINUTE,t.start_dt)
when datepart(hour,t.end_dt) = h.hour
then datepart(MINUTE,t.end_dt)
else 60 end as minutes
from your_table t
join hours h
on (datediff(day,t.start_dt,t.end_dt)=0 and h.hour between datepart(hour,t.start_dt) and datepart(hour,t.end_dt))
or (datediff(day,t.start_dt,t.end_dt)=1 and (h.hour <= datepart(hour,t.start_dt) or h.hour >= datepart(hour,t.end_dt)))
)
select
start_dt,
end_dt,
[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],
[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
from minutes
pivot (max(minutes) for hour
in ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],
[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]
)) as p
Результат:
START_DT END_DT 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
19 Nov 2014 00:00 19 Nov 2014 23:59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59
19 Nov 2014 20:00 20 Nov 2014 19:59 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 59 60 60 60 60
SQL Fiddle Demo
Могут ли раз пересечь полночь? Покрывать целые дни? Любой особый вкус SQL? –
И добро пожаловать в SO, кстати. Традиционно целесообразно t показать некоторую попытку, которую вы сделали в качестве отправной точки. –