2014-01-26 57 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是不同的這兩個查詢?我是否必須同時運行 –