【发布时间】:2021-03-12 11:45:48
【问题描述】:
在考勤系统中,很多用户在使用考勤设备时,在两次以上(clockIn)和两次以上(clockOut)的情况下都会出现错误。所以我有一张表,它可以为所有“重复”用户获取所有记录(ClockIn 和 ClockOut)。
我正在寻找一种方法来仅获取clockout 的max 和clockIn 的min。
我在 stackoverflow 上看到了这个问题的解决方案:
Get Clock In and clock out time from multiple clock in or multiple clock out in SQL Server
我已经测试过了,它给出了预期的结果,但不是在所有情况下。
1/ 我创建的表架构和选择查询:
就我而言,我有一个包含employee_records 的表,我想在同一日期只获得一个ClockIn 和一个ClockOut。
employeerecordId AddAt logtype
我真正需要的是在两个日期(持续时间)之间获取所有时钟输入和时钟输出(同一天只有一个时钟和一个时钟输出)
我该怎么做?
select t.employeeId,MIN(cast(clockIn as time(7))) ClockIn, max(cast(ClockOut as time(7))) clockout
from (select r.employeeId, MIN(cast(r.AddAt as time(7))) clockIn,MAX(cast(r.AddAt as time(7))) clockout , logtype
from emplyee_recoards r
group by r.employeeId,logtype
)t
where CAST(a as date) between @datefrom and @dateto
group by employeeId
2/ 用于测试建议解决方案的样本表数据 here
创建表并在其上插入数据:
Create table #MyTempTable (employeeId int , addat Datetime,LogType int)
Insert into #MyTempTable values (5005,'2019-05-20 21:35:48.490',1)
Insert into #MyTempTable values (5005,'2019-05-20 22:25:00.000',1)
Insert into #MyTempTable values (5005,'2019-05-20 06:48:00.000',0)
Insert into #MyTempTable values (5005,'2019-05-20 07:01:15.383',0)
Insert into #MyTempTable values (5005,'2019-05-25 08:01:15.383',0)
Insert into #MyTempTable values (5005,'2019-05-25 09:01:15.383',0)
Insert into #MyTempTable values (5005,'2019-05-25 22:01:15.383',1)
Insert into #MyTempTable values (5005,'2019-05-25 20:01:15.383',1)
Insert into #MyTempTable values (5006,'2019-05-20 21:25:25.470',1)
Insert into #MyTempTable values (5006,'2019-05-20 23:48:29.568',1)
Insert into #MyTempTable values (5006,'2019-05-20 08:48:29.568',0)
Insert into #MyTempTable values (5006,'2019-05-20 09:38:29.568',0)
Insert into #MyTempTable values (5005,'2019-05-25 08:01:15.383',0)
Insert into #MyTempTable values (5005,'2019-05-25 09:01:15.383',0)
Insert into #MyTempTable values (5005,'2019-05-25 22:01:15.383',1)
Insert into #MyTempTable values (5005,'2019-05-25 20:01:15.383',1)
select employeeId,min(Date) Date ,min(ClockIn) ClockIn ,Max(ClockOut) ClockOut
from (
select employeeId, Min(convert(date,addat)) Date,
Min(addat) ClockIn , Max(addat) ClockOut,LogType
from #MyTempTable
Group by employeeId,LogType
having count(convert(date,addat)) > 1
)t
Group by employeeId
Drop table #MyTempTable
将返回:
预期结果:
EmployeeId AddAt ClockIn ClockOut
5005 2019-05-20 2019-05-20 06:48:00.000 2019-05-20 22:25:00.000
5005 2019-05-25 2019-05-25 08:01:15.383 2019-05-25 22:01:15.383
5006 2019-05-20 2019-05-20 08:48:29.568 2019-05-20 23:48:29.568
5006 2019-05-25 2019-05-25 08:01:15.383 2019-05-25 22:01:15.383
【问题讨论】:
-
请在问题中提供示例数据和期望的结果,也许还可以在 db/sql fiddle 中提供。请清楚说明您要对“重复”行实施的逻辑。
-
别再把你的代码挤在一起了——就像你之前被告知的那样。对其进行格式化,使其易于人类阅读,这将鼓励其他人查看您的代码和您的问题。
-
那么,如果有人在同一天打卡,会发生什么情况: 1. in, in, out 2. in, out, out 3. in, out, in 4. in, out, in , out 5. out, in 6. out, in, out 7.out, in, out, in, 这些你想要什么结果?
-
@SMor ,我已经更新了我的问题。
-
@Charlieface ,在同一天将采取
Max(ClockOut)和Min(ClockIn),这在我的代码中提到。
标签: sql sql-server time-and-attendance