2017-04-06 109 views
2

現在我有一個基於特定條件的總時間問題。例如,我有這樣的事情。總和時間與特定分隔符

enter image description here

由於某些原因,我不得不添加基於他們的活動日的工作時間,如果只在活動日期審批狀態爲審批。

所以對於限制的例子,我有這樣的事情

----------------------------------------------- 
| Activity Date | ApprovalStatus | WorkTime | 
----------------------------------------------- 
| 2017-01-06  | Rejected  | 01:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Approve  | 03:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Waiting  | 02:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Approve  | 01:00:00 | 
----------------------------------------------- 

從這些例子中,接受工作時間,只有將從此情況進行彙總,因此,預期的結果是成爲像下面。預期結果將變爲04:00:00,因爲只有最終結果纔會被批准。

----------------------------------------------- 
| Activity Date | ApprovalStatus | WorkTime | 
----------------------------------------------- 
| 2017-01-06  | Approved  | 04:00:00 | 
----------------------------------------------- 

有沒有什麼啓發來解決這個問題? PS:我正在使用SQL Server 2014.希望你能幫助我,謝謝!

+0

總結只批准同一日期的狀態記錄? –

+0

是@Jibin Balachadran,在同一天:) –

+0

什麼是WorkTime的數據類型? –

回答

2

嘗試像下面

模式:

SELECT * INTO #TAB FROM( 
SELECT '2017-01-06' AS Activity_Date 
, 'Rejected' AS ApprovalStatus 
, '01:00:00' AS WorkTime 
UNION ALL 
SELECT '2017-01-06' , 'Approve' , '03:00:00' 
UNION ALL 
SELECT '2017-01-06' , 'Waiting' , '02:00:00' 
UNION ALL 
SELECT '2017-01-06' , 'Approve' , '01:00:00' 
)A 

現在通過分組日期

SELECT [Activity_Date] 
,CAST(DATEADD(HH,SUM(DATEDIFF(HH,'00:00:00',WorkTime)),'00:00:00') AS TIME(0)) 
FROM #TAB 
WHERE ApprovalStatus='Approve' 
GROUP BY [Activity_Date] 

結果總結小時數列0

+---------------+------------------+ 
| Activity_Date | (No column name) | 
+---------------+------------------+ 
| 2017-01-06 | 04:00:00   | 
+---------------+------------------+ 

UPDATE:

SUM函數只需要精確數值或近似數字數據類型。它不會接受日期或時間數據類型進行求和。

它被記錄在SUM (Transact-SQL)微軟網站上。

SUM([ALL | DISTINCT]表達式)

表達

是常量,列,或功能,和 算術,位和字符串運算的任意組合。表達式是的表達式 的精確數字或近似數值數據類型類別,除了位數據類型爲 。聚合函數和子查詢不允許使用 。

所以你只能有機會寫自己的邏輯來獲得時間總和。這下面將計算時間的總和達幾毫秒。

SELECT [Activity_Date] 
,CAST(DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', WorkTime)), '00:00:00.000') as time(0)) 
FROM #TAB2 
WHERE ApprovalStatus='Approve' 
GROUP BY [Activity_Date] 
+0

,這幾乎是正確的。但是,我不知道爲什麼它不能像04:00 + 03:30那樣處理,應該是07:30,但是您示例的結果是07:00。 –

+0

現在檢查我的信息更新。更新後的查詢也適用於分鐘和秒鐘。 :) @FarisFajar –

1

您可以通過ApprovalStatus過濾記錄,並根據活動日期對工作時間進行彙總。

如果您只想添加小時部分,請使用此選項。

SELECT SUM(DATEDIFF(HH,'00:00:00',WorkTime)) AS [TotalWorktime] 
FROM [YourTable] 
WHERE ApprovalStatus = 'Approve' 
GROUP BY [Activity Date] 

OR

這個,如果你想添加甚至分鐘部分使用。

SELECT SUM(DATEDIFF(MINUTE,'0:00:00',CONVERT(TIME,WorkTime)))/60 + (SUM(DATEDIFF(MINUTE,'0:00:00',CONVERT(TIME,WorkTime)))%60)/100.0 AS [TotalWorktime] 
FROM [YourTable] 
WHERE ApprovalStatus = 'Approve' 
GROUP BY [Activity Date] 
+0

操作數數據類型時間對求和算子無效,我不知道爲什麼? –

+0

回報是像600,400,480 :) –

+0

從你的第一個答案,我說得對。如果總和如03:00 + 04:30,則返回07:00。我不知道爲什麼? –