【发布时间】:2014-01-27 21:40:10
【问题描述】:
我已将此查询写入显示加班如果某人工作时间超过 18:00 pm 时钟时间,无论他/她是什么时间来的或他/她工作的工作持续时间,这超出了主题。它仅在人员工作时间超过 18:00 pm 时才显示 OVERTIME,例如 InTime = 15:16 pm 和 TimeOut= 18:31 然后 Overtime = 00:31。所以我写了下面给出的这个查询,但现在的问题是很少有员工在下午 17:00 离开,他们的加班时间应该在下午 17:00 之后计算(他只在下午 17:00 以上工作了多少分钟+小时),所以那些具体的员工加班时间应该在晚上17:00之后计算
这些员工是:
EmplID 5, 43, 11
所以只有这些加班时间应该在 17:00 之后计算。
查询:
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, cast(min(t1.RecTime) as datetime) AS InTimeSub
, cast(max(t2.RecTime) as datetime) AS TimeOutSub
, 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]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,CONVERT(char(5),CASE WHEN CAST([TimeOutSub] AS DATETIME) >= '18:00' Then
LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST('18:00' AS DATETIME),
CAST([TimeOutSub] AS DATETIME)),0), 108),5) ELSE '00:00' END, 108) AS OVERTIME
FROM times
输出:
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql