【发布时间】:2014-01-22 19:00:26
【问题描述】:
我编写并管理了这个查询,以通过 dateDiff 函数计算一个人每天工作的总时间,现在我被困在一个地方。我想计算一下,如果一个人随着时间的推移已经完成,那么新列应该在 hh:mm 中显示 OVERITME。
我们办公室的总工作时间为 08:00,超过 8 小时被视为加班,例如如果一个人的工作时间是 08:35,那么一列应该显示一个人的工作时间是 00:35
查询:
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN
AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
inner join
HrEmployee t3
ON t3.EmplID = t1.EmplID
group by
t1.EmplID
, t3.EmplName
, t1.RecDate
)
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,CASE
WHEN minpart = 0
THEN CAST(hourpart AS NVARCHAR(200)) + ':00'
WHEN minpart <10
THEN CAST(hourpart AS NVARCHAR(200)) + ':0'+ CAST(minpart AS NVARCHAR(200))
ELSE CAST(hourpart AS NVARCHAR(200)) + ':' + CAST(minpart AS NVARCHAR(200))
END AS 'total time'
FROM (
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,DATEDIFF(minute, InTime, [TimeOut])/60 AS hourpart
,DATEDIFF(minute, InTime, [TimeOut]) % 60 AS minpart
FROM times
) source
输出:
【问题讨论】:
-
只是伪代码:您可以使用您的
total_time并从中减去 8:CASE WHEN total_time - 8 > 0 THEN total_time - 8 ELSE 0 END overtime
标签: sql tsql sql-server-2012