2017-03-16 94 views
1

我有一個時間和超時,並且有一個時間範圍爲午餐早餐和晚餐定義。我想要的是從出席時間(時間和時間)中減去這些時間。檢查其他時間範圍的時間範圍失效

的樣品數據

考勤表數據

EMPID 1095 

TimeIN 2017-03-01 08:52:45.000 

TimeOut 2017-03-01 19:59:18.000 

混亂時序

type StartTime EndTime 
BreakFast 06:30:39 10:00:39 
Dinner 19:00:39 21:00:39 
Lunch 12:00:23 15:00:23 

我需要的是從實際出勤時間減去這些亂七八糟的時機,以獲得實際員工值勤時間。

感謝。

+0

嗨,你可以有多個時間在和超時一天?或者它是固定的1次,每天1次出去 –

+0

甚至更​​難 - 時間在一天,並在下一個時間(如在夜班)? –

+0

那麼我已經整理出來的時間進出是單次進入。 – Kamran

回答

0

此方法利用數字表創建查找表,查找您的@TimeIn@TimeOut值之間的所有秒數。這將適用於多天的期間,儘管有一些嚴重的警告:

  • 早餐,午餐和晚餐是在同一時間每天。
  • 您的@TimeIn@TimeOut期間沒有那麼大,它溢出了包含seconds的數字的int值。
    • 在這種情況下,你將需要或者只是使用minutes或找到一個不同的方法
  • 你的返回值是小於24小時。
    • 在這種情況下,不要將差異作爲time數據類型返回,並相應地處理它。

declare @TimeIn datetime = '2017-03-01 08:52:45.000' 
     ,@TimeOut datetime = '2017-03-01 19:59:18.000' 

     ,@BStart time  = '06:30:39' 
     ,@BEnd time   = '10:00:39' 
     ,@LStart time  = '12:00:23' 
     ,@LEnd time   = '15:00:23' 
     ,@DStart time  = '19:00:39' 
     ,@DEnd time   = '21:00:39'; 

-- Create numbers table then use it to build a table os seconds between TimeIn and TimeOut 
with n(n) as (select n from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) as n(n)) 
    ,s(s) as (select top (select datediff(s,@TimeIn,@TimeOut)+1) dateadd(s,row_number() over (order by (select 1))-1,@TimeIn) from n n1,n n2,n n3,n n4,n n5,n n6) 
select cast(dateadd(s,count(1),0) as time) as s 
from s 
where s between @TimeIn and @TimeOut -- Return all seconds that aren't within Breakfast, Lunch or Dinner 
    and cast(s as time) not between @BStart and @BEnd 
    and cast(s as time) not between @LStart and @LEnd 
    and cast(s as time) not between @DStart and @DEnd 

將返回:05:59:58.0000000

0

我已經在其他表亂七八糟的日常定時,我創建了一個視圖,把各個領域的日常考勤面前,然後使用case語句將時間與每日考勤時間相匹配。

EmployeeID AttendanceDate ShiftID TimeIn TimeOut BreakOut BreakIn LeaveType TotalHours LeaveHours ATOThours DeductedHrs OTHours UserID AudtDate Reason SM SY OTDed DutyDed Mark Expr1 MARKL BreakFastStart BreakFastEnd LunchStart LunchEnd DinnerStart DinnerEnd 
1095 2017-03-01 00:00:00.000 1 2017-03-01 08:52:45.000 2017-03-01 19:59:18.000 NULL NULL NULL 0 NULL 0 0 0 NULL NULL NULL 3 2017 NULL NULL NULL NULL NULL 2017-02-20 06:30:34.000 2017-02-20 09:30:34.000 2017-02-20 12:00:26.000 2017-02-20 15:00:26.000 2017-02-20 19:00:59.000 2017-02-20 21:00:59.000 

現在很好,隨着時間的推移會檢查它的可信度。

感謝支持

0

您也可以使用下面的腳本在視圖或連接表的查詢。注意我得到了一個我認爲是正確的不同答案。

SELECT CONVERT(varchar, DATEADD(ss, 
     (DATEDIFF(ss,TimeIn, [TimeOut]) - 
     (
      DATEDIFF(ss,[BreakFastStartTime], [BreakFastEndTime]) + 
      DATEDIFF(ss,[LunchStartTime], [LunchEndTime]) + 
      DATEDIFF(ss,[DinnerStartTime], [DinnerEndTime]) 
     ) 
     ), 0), 108) 
FROM [Attendance Data] 

對於你的榜樣,答案是02:36:33