2015-05-05 69 views
0

我在使用Microsoft SQL Server時遇到困難。我有一張表,其中有一列開始時間,以秒爲單位7200(換班2小時)以及結束時間和持續時間。帶有開始時間和結束時間的SQL事件,轉換爲小時轉換

我需要按小時對事件持續時間進行分組。

我的查詢是目前:

SELECT 
    e.eqmtid as LoadUnit 
    ,r.name as Reason 
    ,e.starttime 
    ,e.endtime 
    ,e.duration 

FROM 
    sh_status_events e 

INNER JOIN 
    PIT_ReasonCodes r 
    ON e.reason = r.reason 

WHERE 
    e.shiftindex >= <STARTSHIFTINDEX> 
    AND e.shiftindex <= <ENDSHIFTINDEX> 

返回結果:

LoadUnit Reason starttime endtime duration 
EX022 OPERATING 0   1008 1008 
EX022 OPERATING 1008  2898 1890 
EX022 OPERATING 2898  3535 637 
EX022 OPERATING 3615  4515 900 
EX022 OPERATING 4515  4541 26 
EX022 OPERATING 4885  5555 670 

但我需要按小時,如:

Hour  Reason  Duration 
1stHour  Operating 2400 
2ndHour  Operating 1000 
3rdHour  Operating 3200 
4thHour  Operating 3600 
5thHour  Operating 3600 
6thHour  Operating 1322 

,我可以做的,但對於任何一個小時開始並在另一個小時結束的事件,它不會把時間帶到下一個小時。

例如賽事從90分鐘開始並持續1小時,應該是

2ndHour  Operating 1800 
3rdHour  Operating 3600 

但是它會把整個5400放到第二個小時。

有沒有任何可協調的方法來解決這個問題?

回答

0

首先您需要確定總小時數。你可以使用MAX(endtime)CEILING。像這樣的(SELECT CEILING(MAX(endTime) /3600.0) FROM @LoadUnit)。然後,您可以使用CTE或數字表格獲取開始和結束時間的小時數。

然後我們可以使用CROSS APPLY來得到你想要的。像這樣的SQL Fiddle

樣本數據

DECLARE @LoadUnit TABLE (LoadUnit CHAR(5),Reason VARCHAR(20),starttime INT,endtime INT, duration INT) 

INSERT INTO @LoadUnit VALUES 
('EX022','OPERATING', 0,   1008, 1008), 
('EX022','OPERATING', 1008,  2898, 1890), 
('EX022','OPERATING', 2898,  3535, 637), 
('EX022','OPERATING', 3615,  4515, 900), 
('EX022','OPERATING', 4515,  4541, 26), 
('EX022','OPERATING', 4885,  5555, 670); 

查詢

DECLARE @MaxCeiling INT = (SELECT CEILING(MAX(endTime) /3600.0) FROM @LoadUnit) 
;WITH Hrs as 
(
    SELECT 1 hrs,0 as StartTime,3599 as EndTime 
    UNION ALL SELECT hrs + 1,StartTime + 3600,EndTime + 3600 from Hrs WHERE hrs + 1 <= @MaxCeiling 
) 
SELECT H2.hrs,Reason,SUM(H2.endtime - H2.starttime) as Duration 
FROM @LoadUnit L 
CROSS APPLY 
(
SELECT H.hrs, 
CASE WHEN L.starttime < H.StartTime THEN H.StartTime ELSE L.starttime END StartTime, 
CASE WHEN L.endtime > H.endtime THEN H.Endtime ELSE L.Endtime END endTime 
FROM hrs H 
)H2 
WHERE H2.endtime - H2.starttime >=0 
GROUP BY H2.hrs,Reason 
+0

非常感謝您的答覆!這正是我需要它做的小提琴,但它不工作時,我試圖通過我的數據庫運行它:(使用Microsoft SQL Server 2008 R2(SP1) - 10.50.2550.0(X64)我無法弄清楚爲什麼它不起作用,所有這些命令都可以在早期版本中使用? – Jakose

+0

是的,這也適用於sql 2008 R2。 – ughai

+0

我必須在頂部添加'SET NOCOUNT ON',因爲它與引擎聲明貫穿始終,不能夠感謝你,這讓我省了很多心痛。 – Jakose

相關問題