2015-09-24 43 views
0

我有如下的數據,包括開始日期和結束日期。記錄只會在同一天開始和結束。如何將連續的日期範圍分成一天中每天在SQL中花費的時間

我想擴大每個記錄有小時的列將包含在每個小時花費的時間。例如:

ID  START_TIME  END_TIME   
AAAA 09/10/2015 9:30 09/10/2015 13:15 

將成爲

ID  START_TIME  END_TIME  H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H24 

AAAA 9/10/2015 9:30 9/10/2015 13:15 0 0 0 0 0 0 0 0 0 30 60 60 60 15 0 0 0 0 0 0 0 0 0 0 
+1

同樣的例子你得到一個錯誤?請發佈您正在使用的查詢,以及您獲得的結果。 –

回答

0

您可以用大量的case語句做到這一點。幾分鐘在每個小時的數量的邏輯是基於時間跨度是否在開始之前,或一小時後,是否在之前結束,以後:

select id, start_time, end_time, 
     ((case when datepart(hour, end_time) < 0 then 0 
       when datepart(hour, end_time) = 0 then datepart(minute, end_time) 
       else 60 
     end) 
     (case when datepart(hour, start_time) < 0 then 60 
       when datepart(hour, start_time) = 0 then datepart(minute, start_time) 
       else 0 
     end) 
     ) as h00, 
     ((case when datepart(hour, end_time) < 1 then 0 
       when datepart(hour, end_time) = 1 then datepart(minute, end_time) 
       else 60 
     end) 
     (case when datepart(hour, start_time) < 1 then 60 
       when datepart(hour, start_time) = 1 then datepart(minute, start_time) 
       else 0 
     end) 
     ) as h01, 
     . . . 
+0

在每列中的兩個case語句之間是否缺少某種操作符? –

+0

同意@TabAlleman,每個小時在'CASE'之間發生了什麼?我採用了類似的解決方案,但希望在你的腰帶上有一些奇特的功能 –

2

您可以通過這樣做創建一個具有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

+0

我讀過你提到一天結束時的「黑客」,但OP說日期將始終是同一日期。無論如何,最好的解決方案 –

+0

@JuanCarlosOropeza由於輔助表中的結束時間是23:59:59,這意味着比應該少一分鐘,這就是爲什麼-1秒 –

相關問題