Sql 需要计算加班费的总和
我有一个表测试Sql 需要计算加班费的总和,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表测试 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
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
我想要像这样的订单
name accountid Overtime
ABC 7 02:07:00
加班总和如何实现该总和不符合时间数据类型 您可以按名称、帐户ID和用途对数据进行分组
SUM(DATEDIFF(ss,'00:00:00.000',[您的加班费])
查找总秒数,最后使用DATEADD()函数将秒数转换回时间
更新:
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
如果您预计一个acc_id的加班时间可能超过24小时,则可以添加另一列以显示天数(秒数/(3600*24))总和不适用于时间数据类型 您可以按名称、帐户ID和用途对数据进行分组
SUM(DATEDIFF(ss,'00:00:00.000',[您的加班费])
查找总秒数,最后使用DATEADD()函数将秒数转换回时间
更新:
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
如果您预计一个acc_id的加班时间可能超过24小时,则可以添加另一列以显示天数(秒数/(3600*24))
使用上述查询计算加班时间
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
使用上述查询计算加班时间
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。
返回
AccountName AccountID OverTime
ABC 7 02:07:00.0000000
要获得更具可读性的版本,您可以使用CTE。
它也将满足您的要求,所以请尝试与此以及:(它只适用于2012年)
它也将满足您的要求,所以请尝试与此以及:(它只适用于2012年)
告诉它将其他两个值和组相加,如usual@SamiKuhmonen我已经试过cast(sum(CheckOutTime as time))
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