2017-09-01 165 views
0

我想從一個開始時間查找每個人的持續時間。我想計算從每天的1個開始時間到多個用戶的多個結束時間的持續時間。這是我的代碼:如何使用Microsoft SQL計算持續時間?

SELECT *, 
     CAST(DATEDIFF(n, CAST(End_Time AS datetime), 
     CAST(Start_Time AS datetime)) AS FLOAT)/60 AS Time_Duration 
FROM 
    (SELECT NAME, 
       MAX(CASE WHEN DESCRIPTION = 'Green' THEN Final_Value END) AS Start_Time, 
       MAX(CASE WHEN DESCRIPTION = 'Red' THEN Final_Value END) AS End_Time 
     FROM mydata 
     WHERE NAME != ‘NA’ 
     GROUP BY NAME 
    ) C 

我無法獲得任何持續時間的結果。 這是我的輸出是什麼樣子:

Name  Start_time   End_time  Time_Duration 
1 Day_1  5/6/15 2:30 
2 John       5/6/15 3:30   
3 Ben       5/6/15 4:30   
4 Mike       5/6/15 5:30   
5 Day_2  5/7/15 2:30 
6 John_2       5/7/15 4:30   
7 Ben_2       5/7/15 5:30   
8 Mike_2       5/7/15 6:30   

我希望它看起來像這樣:

Name  Start_time   End_time  Time_Duration 
1 Day_1  5/6/15 2:30 
2 John       5/6/15 3:30   1.00 
3 Ben       5/6/15 4:30   2.00 
4 Mike       5/6/15 5:30   3.00 
5 Day_2  5/7/15 2:30 
6 John_2       5/7/15 4:30   2.00 
7 Ben_2       5/7/15 5:30   3.00 
8 Mike_2       5/7/15 6:30   4.00 
+1

請參閱:[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve對於什麼似乎對我來說是一個非常簡單的SQL查詢) – Strawberry

+0

看起來像SQL服務器/ t-sql函數。你能否提供你的邏輯更多細節?你在同一行中有NULL或NULL的開始或結束時間,這就是你沒有得到正確結果的原因 – EricZ

+1

問題:你的外層'SELECT'一次只能在一行上工作。然而,你的內部'SELECT'產生你需要組合的多行。不幸的是,我現在缺乏時間進一步幫助,但也許我的分析有幫助... –

回答

1

假設在名稱列中的值有一天數的後綴(且沒有1天)

WITH td AS 
(
SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY [day] ORDER BY final_value) rnum 
    FROM (SELECT *, 
       CASE WHEN CHARINDEX('_', name) = 0 
        THEN '1' 
        ELSE SUBSTRING(name, CHARINDEX('_', name) + 1, LEN(name) - CHARINDEX('_', name)) 
       END [day]   
      FROM t_dur 
     ) tt 
) 

SELECT t1.name, 
     CASE WHEN rnum = 1 THEN t1.final_value END start_time, 
     CASE WHEN rnum <> 1 THEN t1.final_value END end_time, 
     CASE CAST(DATEDIFF(hour, (SELECT t2.final_value FROM td t2 WHERE t2.[day] = t1.[day] AND t2.rnum = 1), 
         t1.final_value) AS DECIMAl(5,2)) 
      WHEN 0 THEN NULL 
      ELSE CAST(DATEDIFF(hour, (SELECT t2.final_value FROM td t2 WHERE t2.[day] = t1.[day] AND t2.rnum = 1), 
         t1.final_value) AS DECIMAl(5,2)) 
     END time_duration 
    FROM td t1 

結果

name start_time    end_time    time_duration 
Day_1 2015-05-06 02:30:00.000 NULL     NULL 
John NULL     2015-05-06 03:30:00.000 1.00 
Ben  NULL     2015-05-06 04:30:00.000 2.00 
Mike NULL     2015-05-06 05:30:00.000 3.00 
Day_2 2015-05-07 02:30:00.000 NULL     NULL 
John_2 NULL     2015-05-07 04:30:00.000 2.00 
Ben_2 NULL     2015-05-07 05:30:00.000 3.00 
Mike_2 NULL     2015-05-07 06:30:00.000 4.00