Sql 按具体时间计算时间
办公时间:上午10:00至下午18:00。 办公室政策:事实上,我们的办公室政策是向员工支付加班津贴,因此他们只计算超过下午18:00的加班时间,即使员工在下午17:00到达办公室,并且工作到下午18:54,那么他将获得54分钟的加班费,除此之外,他没有工作的时间将导致从工资中扣除,但仍适用于加班津贴 问题:我写这个查询是为了计算一个人每天工作的总时间,我指的是他的工作时间。现在,我试图计算一个新的列“加班时间”,该列应显示一个人加班的持续时间,当且仅当一个人工作时间超过下午18:00时,该时间应在加班列“其他明智的00:00”下,因此请帮助我Sql 按具体时间计算时间,sql,sql-server,tsql,sql-server-2005,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2005,Sql Server 2008 R2,办公时间:上午10:00至下午18:00。 办公室政策:事实上,我们的办公室政策是向员工支付加班津贴,因此他们只计算超过下午18:00的加班时间,即使员工在下午17:00到达办公室,并且工作到下午18:54,那么他将获得54分钟的加班费,除此之外,他没有工作的时间将导致从工资中扣除,但仍适用于加班津贴 问题:我写这个查询是为了计算一个人每天工作的总时间,我指的是他的工作时间。现在,我试图计算一个新的列“加班时间”,该列应显示一个人加班的持续时间,当且仅当一个人工作时间超过下午18:00时,该时间
WITH Times AS
( SELECT emp.EmplID,
emp.EmplName,
InTime = MIN(atd.RecTime),
OutTime = MAX(atd.RecTime),
TimeWorked = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)),
[DateVisited] = atd.RecDate
FROM AtdRecord atd
INNER JOIN HrEmployee emp
ON atd.EmplID = emp.EmplID
GROUP BY emp.EmplID, emp.EmplName, atd.RecDate
HAVING COUNT(atd.RecTime) > 1
)
SELECT t.EmplID,
t.EmplName,
t.InTime,
t.OutTime,
t.DateVisited,
TimeWorked = CONVERT(CHAR(5), DATEADD(MINUTE, t.TimeWorked, 0), 8)
FROM Times t
输出:
Vignesh Kumar解决方案的输出:
我想你可以做一分钟的约会,休息时间,“18:00”。如果结果是肯定的,那么他们就得加班。如果不是,则只返回一个0。这可以在案例陈述中完成:
SELECT
CASE
WHEN DATEDIFF(MINUTE, OutTime, '18:00') > 0 THEN DATEDIFF(MINUTE, OutTime, '18:00')
ELSE 0
END AS 'Overtime'
您可能需要设置18:00:00以使SQL Server将其视为小时而不是分钟。请尝试以下操作:
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
我在这里添加了新的解决方案。尝试一下这是一个很好的解决方案,但它显示加班时间,即使一个人从9:00工作到17:15,但不,我想,如果且仅当一个人工作到下午18:00以上,那么应该显示加班时间,例如13:15到18:20,那么加班时间=20分钟。您可以发布示例数据吗?在SQLFiddle中,我不得不检查我的帖子,它被更新了,在我的帖子中,最后一张图片不不,不正确,参见第一条记录,它说加班=00:06,但它应该显示01:08,因为如果一个人从9:00工作到17:15,那么这很多时间都在18:00以上,pmi想要,但是不,我想要如果并且只有当一个人在下午18:00以上工作时,才显示加班,例如13:15至18:20,则加班时间=20分钟