Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按具体时间计算时间_Sql_Sql Server_Tsql_Sql Server 2005_Sql Server 2008 R2 - Fatal编程技术网

Sql 按具体时间计算时间

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时,该时间

办公时间:上午10:00至下午18:00。 办公室政策:事实上,我们的办公室政策是向员工支付加班津贴,因此他们只计算超过下午18:00的加班时间,即使员工在下午17:00到达办公室,并且工作到下午18:54,那么他将获得54分钟的加班费,除此之外,他没有工作的时间将导致从工资中扣除,但仍适用于加班津贴

问题:我写这个查询是为了计算一个人每天工作的总时间,我指的是他的工作时间。现在,我试图计算一个新的列“加班时间”,该列应显示一个人加班的持续时间,当且仅当一个人工作时间超过下午18:00时,该时间应在加班列“其他明智的00: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分钟