Sql 检查其他时间范围内的时间范围失效

Sql 检查其他时间范围内的时间范围失效,sql,sql-server,database,Sql,Sql Server,Database,我有一个进出时间,午餐、早餐和晚餐都有一个时间范围。我想要的是从出勤时间中减去这些时间(进入和退出时间) 样本数据为 考勤表数据 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

我有一个进出时间,午餐、早餐和晚餐都有一个时间范围。我想要的是从出勤时间中减去这些时间(进入和退出时间)

样本数据为

考勤表数据

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
我需要的是从实际出勤时间中减去这些混乱时间,得到实际的员工上班时间


谢谢。

此方法使用数字表创建一个查找表,列出
@TimeIn
@TimeOut
值之间的所有秒数。这将在几天内有效,尽管有一些严重的警告:

  • 早餐、午餐和晚餐每天都在同一时间
  • 您的
    @TimeIn
    @TimeOut
    时间段不会太大,它会溢出包含
    秒数的
    int
    值。
    • 在这种情况下,您需要使用
      minutes
      或找到其他方法
  • 您的返回值小于24小时。
    • 在这种情况下,不要将差异作为
      time
      数据类型返回,并相应地进行处理


返回:
05:59:58.0000000

此方法使用数字表来创建
@TimeIn
@TimeOut
值之间所有秒数的查找表。这将在几天内有效,尽管有一些严重的警告:

  • 早餐、午餐和晚餐每天都在同一时间
  • 您的
    @TimeIn
    @TimeOut
    时间段不会太大,它会溢出包含
    秒数的
    int
    值。
    • 在这种情况下,您需要使用
      minutes
      或找到其他方法
  • 您的返回值小于24小时。
    • 在这种情况下,不要将差异作为
      time
      数据类型返回,并相应地进行处理


它返回:
05:59:58.0000000

我在其他表中有每天的混乱计时,因此我创建了一个视图,并在每天出勤之前获取所有字段,然后使用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
就目前而言,随着时间的推移,它会检查自己的可信度


感谢您的支持

我在其他表中有每天的时间安排,因此我创建了一个视图,并在每日出勤前获取所有字段,然后使用案例语句将时间安排与每日出勤时间相匹配

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
就目前而言,随着时间的推移,它会检查自己的可信度


感谢您的支持,您还可以在表的视图或联接查询中使用以下脚本。注:我得到了一个不同的答案,我认为是正确的

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

您也可以在表的视图或联接查询中使用以下脚本。注:我得到了一个不同的答案,我认为是正确的

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

您好,您一天可以有多个时间进出吗?或者它是固定的,每天一次输入,一次输出,或者更难-一天输入一次,下一天超时(比如夜班)?我已经把输入和输出的时间分类为一次输入。这需要有多具体?到最近的分钟或秒?嗨,你能有一天的多次进出时间吗?或者它是固定的,每天一次输入,一次输出,或者更难-一天输入一次,下一天超时(比如夜班)?我已经把输入和输出的时间分类为一次输入。这需要有多具体?到最近的分或秒?