2014-01-26 52 views
0

办公时间:上午10:00至下午18:00。加班专栏

我已经写了这个查询来显示加班,如果有人工作超过8小时,例如,如果他工作'08:44小时'比加班节目00:44,但现在我不想要这个。

我不想根据TOTAL WORK TIME来计算它。我希望如果人员的工作时间超过时间18:00,那么应该显示加班时间。

例如如果人员从上午10点50分到下午18点33分加班,则应该显示00:33。只有当一个人在18点以上工作,那么加班应该被计算在内。

n.b.其实,我们的办公室政策是向员工支付加班费用,所以他们计算的加班时间仅高于18:00时钟时间,即使人员在下午17:00到达办公室并且工作到18时54分,即使他会加班时间为54分钟,除此之外,他没有工作的时间会导致工资减免,但仍然适用于加班津贴。

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)), 
      OverTime = DATEDIFF(MINUTE, MIN(atd.RecTime), MAX(atd.RecTime)) - 480, 
      [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), 
     OverTime = CASE WHEN t.OverTime < 0 THEN '-' ELSE '' END + 
           CONVERT(CHAR(5), DATEADD(MINUTE, ABS(t.OverTime), 0), 8) 
FROM Times t 
+0

删除了大写字母和粗体字体,因为没有增加问题的清晰度,通常被认为是大喊大叫/坏的网络礼仪。 –

回答

0

这是您尝试使用的逻辑吗?

DECLARE @EndTimeA TIME = '18:00', 
     @EndTimeB TIME = '18:05', 
     @EndTimeC TIME = '19:00', 
     @EndTimeD TIME = '17:55' 


SELECT OvertimeMM_A = CASE WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA) 
           ELSE 0 
          END 
     ,OvertimeMM_B = CASE WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB) 
           ELSE 0 
          END 
     ,OvertimeMM_C = CASE WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC) 
           ELSE 0 
          END 
     ,OvertimeMM_D = CASE WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD) 
           ELSE 0 
          END 

表示为TIME;

DECLARE @EndTimeA TIME = '18:00', 
     @EndTimeB TIME = '18:05', 
     @EndTimeC TIME = '19:00', 
     @EndTimeD TIME = '17:55' 


SELECT CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_A, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_B, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_C, '00:00'), 8) 
     ,CONVERT(CHAR(5), DATEADD(MINUTE, OvertimeMM_D, '00:00'), 8) 
FROM 
(
    SELECT OvertimeMM_A = CASE WHEN @EndTimeA > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeA) 
            ELSE 0 
           END 
      ,OvertimeMM_B = CASE WHEN @EndTimeB > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeB) 
            ELSE 0 
           END 
      ,OvertimeMM_C = CASE WHEN @EndTimeC > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeC) 
            ELSE 0 
           END 
      ,OvertimeMM_D = CASE WHEN @EndTimeD > '18:00' THEN DATEDIFF(MINUTE, '18:00', @EndTimeD) 
            ELSE 0 
           END 
)DT 
+0

看看有什么时间一个人进入办公室,那是另一个故事,我想要的是,如果人工作超过18:00 pm那么该时间应该显示在加班栏中,否则, –

+0

你能帮我解释一下吗?提供的代码无法执行刚描述的逻辑? – MarkD

+0

Sok lemme测试这些,但只是告诉我wt是不同的这两个查询?我是否必须同时运行 –