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