您可以通過這樣做創建一個具有24小時小時數的表格,使用小時數並開始結束時間,將數據與數據交叉連接,使用額外的表格進行計算並使用數據透視表將數據重新組合在一起。
這對於處理一天結束有一點難看的黑客攻擊,並從結束時間扣除一秒。
SQL:
with data as (
select *,
case when convert(time, endtime) < S or convert(time, starttime) > E
then 0 else
60
- case when S < convert(time, starttime) and E > convert(time, starttime)
then datediff(minute, convert(time, starttime), E) else 0 end
- case when S < convert(time, endtime) and E >= convert(time, endtime)
then datediff(second, dateadd(second, -1, convert(time, endtime)), E)/60 else 0 end
end as minutes
from table1 d cross join hours h
)
select * from
(SELECT id, starttime, endtime, h, minutes from data) p
PIVOT
(
sum (minutes)
FOR H 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 pvt
我使用的設置:
create table table1 (
id char(4),
starttime datetime,
endtime datetime
)
insert into table1 values
('AAAA','09/10/2015 9:30','09/10/2015 13:15'),
('BBBB','09/10/2015 9:30','09/10/2015 23:59')
create table hours (
H tinyint,
S time,
E time
)
insert into hours values
(0,'00:00','01:00'),
(1,'01:00','02:00'),
(2,'02:00','03:00'),
(3,'03:00','04:00'),
(4,'04:00','05:00'),
(5,'05:00','06:00'),
(6,'06:00','07:00'),
(7,'07:00','08:00'),
(8,'08:00','09:00'),
(9,'09:00','10:00'),
(10,'10:00','11:00'),
(11,'11:00','12:00'),
(12,'12:00','13:00'),
(13,'13:00','14:00'),
(14,'14:00','15:00'),
(15,'15:00','16:00'),
(16,'16:00','17:00'),
(17,'17:00','18:00'),
(18,'18:00','19:00'),
(19,'19:00','20:00'),
(20,'20:00','21:00'),
(21,'21:00','22:00'),
(22,'22:00','23:00'),
(23,'23:00','23:59:59')
在SQL Fiddle
同樣的例子你得到一個錯誤?請發佈您正在使用的查詢,以及您獲得的結果。 –