根据具体时间计算时间

时间:2014-01-27 06:48:45

标签: sql sql-server tsql sql-server-2005 sql-server-2008-r2

办公室时间:10:00 am to 18:00 pm。 办公室政策:实际上,我们的办公室政策是向员工支付加班费,因此他们只计算加班时间超过18:00 pm时间,即使该人到达办公室17:00 pm并且已经工作到{{1}即便如此,他将获得18:54 pm的报酬,除了他没有工作的时间会导致从工资中扣除,但仍然适用于加班津贴。

问题:我写了这个查询来计算一个人每天工作的总时间,我的工作时间我的意思。现在我正在尝试计算一个新列54mins overtime,该列应该显示一个人已经完成加班的持续时间,当且仅当一个人的工作时间超过OVERTIME时,该时间应该在加班列以外的其他方面{ {1}}请帮助我

18:00 pm

输出:

Image

Vignesh Kumar解决方案的输出:

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为你可以做DATEDIFF(MINUTE,OutTime,'18:00')。如果结果是积极的,那么他们就加班了。如果没有,那么只返回0.这可以在CASE语句中完成:

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将其视为小时而非分钟。)

答案 1 :(得分:1)

请改为尝试:

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

Source