2016-09-16 84 views
0

的總和我有一個表TEST需要計算加班

AccountName AccountIndex AccountID StartTime EndTime  checkouttime     
ABC    3    7  07:00:00.00 16:00:00.00 2016-07-22 17:03:00  
ABC    3    7  07:00:00.00 16:00:00.00 2016-07-23 16:00:00  
ABC    3    7  07:00:00.00 16:00:00.00 2016-07-25 17:04:00  

我要計算加班的總和。

我想這

select name,accountid,case when (cast(CheckOutTime as time) < EndTime) then '-' else '' end + 
convert(varchar(8), 
    dateadd(minute, 
    abs(
    DATEDIFF(minute, 
    cast(CheckOutTime as time) 
    , EndTime) 
    ) 
,0) 
,108) as Overtime 
from test 

,我得到的O/P爲

name accountid Overtime  
ABC  7   01:03:00 
ABC  7   00:00:00 
ABC  7   01:04:00 

我想有一個像加班

name accountid Overtime  
ABC   7  02:07:00  

總和O/P如何做到這一點

+0

告訴它由兩個人來總結的價值和組,像往常一樣 –

+0

@SamiKuhmonen我已經嘗試過案件時(cast(sum(CheckOutTime as time))

+0

將總和作爲最外層函數,因爲您正在對結果進行求和 –

回答

1
select accountid,name,cast((totalseconds/3600) as varchar) + ':' + cast(((totalseconds%3600)/60) as varchar) as overtime 
from 
(
select accountid,name, 
      sum(Datediff(s,Endtime,cast(checkouttime as time))) as totalseconds 
    group by accountid,name 
    ) t 

使用上面的查詢,計算加班

+0

它正在計算像accountid \t加班 03:00:00:000其計算不正確 –

+0

@RedDevil列名在myquery中不正確。修改我的查詢。請現在檢查 –

+0

它給我一個錯誤轉換varchar值':'到數據類型int轉換失敗。 –

0

SUM不適用於時間數據類型。

您可以通過組名的數據,帳戶ID和使用

SUM(DATEDIFF(ss, '00:00:00.000', [your overtime value]))

找到的總秒數,並最終轉換成秒數回時間DATEADD()函數。

UPDATE:

select 
    acc_id, 
    name, 
    CONVERT(VARCHAR(20), DATEADD(ss, SUM(DATEDIFF(ss, '00:00:00.000', [your overtime value])), '00:00:00'), 114) as overtime 
from [your table] 
group by acc_id, name 

如果你期望的加班可能會超過24小時,一個ACC_ID,那麼你可以添加其他欄,顯示的天(秒/(3600 * 24號號) )

1
Declare @YourTable table (AccountName varchar(50),AccountIndex int,AccountID int,StartTime varchar(25),EndTime varchar(25), checkouttime datetime) 
Insert into @YourTable values 
('ABC',3,7,'07:00:00.00','16:00:00.00','2016-07-22 17:03:00'), 
('ABC',3,7,'07:00:00.00','16:00:00.00','2016-07-23 16:00:00'),  
('ABC',3,7,'07:00:00.00','16:00:00.00','2016-07-25 17:04:00') 

Select AccountName 
     ,AccountID 
     ,OverTime = cast(DateAdd(MINUTE,sum(DateDiff(MINUTE,cast(EndTime as time),case when cast(EndTime as time)>cast(checkouttime as time) then cast(EndTime as time) else cast(checkouttime as time) end)),'00:00:00') as time) 
From @YourTable  
Group By AccountName,AccountID 

返回

AccountName AccountID OverTime 
ABC   7   02:07:00.0000000 

對於一個更可讀的一個,你可以使用一個CTE。

;with cteBase as (
    Select AccountName 
      ,AccountID 
      ,EndTime  =cast(EndTime as time) 
      ,checkouttime=cast(checkouttime as time) 
    From @YourTable 
) 
Select AccountName 
     ,AccountID 
     ,OverTime = cast(DateAdd(MINUTE,sum(DateDiff(MINUTE,EndTime,case when EndTime>checkouttime then EndTime else checkouttime end)),'00:00:00') as time) 
From cteBase  
Group By AccountName,AccountID 
+0

這裏有1個問題,如果超時超過23:59:59那麼它再次從0開始,這使得總和功能不正確 –

+0

如果超過24,我們可以總結25小時 –

+0

@RedDevil只是格式化的問題。給我一點時間 –

0

它也將滿足您的要求,所以請儘量與此還有:(只適用2012年)

SELECT AccountName, AccountID, 
    CONCAT(t.tot/60, ':', t.tot%60,':00') orverTime 
FROM (
    SELECT AccountName, AccountID, 
    SUM(DATEDIFF(mi, CONCAT(SUBSTRING(
    CAST(checkouttime AS VARCHAR(50)), 1, 11), ' ', EndTime), 
    checkouttime)) tot 
FROM #tmp 
GROUP BY AccountName, AccountID) t 
+0

這給了我一個錯誤'CONCAT'不是一個公認的內置函數名稱。 –

+0

您是否嘗試過完全相同,因爲它在SQL Server 08和12中測試的地方工作正常。有一點,CONCAT是SQL Server公認的功能。請重新驗證它。 – Susang

+0

我在2008年和2012年都試過這兩個查詢在2012年都有效,但在2008年給出了一個錯誤 –