从记录员工那里获得一次上班打卡和一次下班打卡时间 table
Get one Clock In and one clock out time from a record employee table
在考勤系统中,很多用户在使用考勤机时,会出现两次以上(针对clockIn
)和两次以上(针对clockOut
)的印记错误.所以我有一个 table 获取所有用户“重复”的所有记录(ClockIn
和 ClockOut
)。
我正在寻找一种方法来仅获取 clockout
的 max
和 clockIn
的 min
。
我在 Whosebug 上看到了这个问题的解决方案:
我已经测试过了,它给出了预期的结果,但并非在所有情况下都如此。
1/ Table 我创建的架构和 select 查询:
在我的例子中,我有一个包含 employee_records 的 table,我想在同一日期只得到一个 ClockIn
和 ClockOut
。
employeerecordId AddAt logtype
我真正需要的是获取两个日期(持续时间)之间的所有 clockIn 和 clockOut(同一天只有一个 clock 和一个 clockOut)
我该怎么做?
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/ 样本 table 数据以测试所提出的解决方案
here
创建 table 并在其上插入数据:
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
将return:
预期结果:
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
您似乎想按员工和日期分组,然后使用条件聚合拆分签到和签退。
select
employeeId,
convert(date,addat) Date,
Min(CASE WHEN LogType = 0 THEN addat END) ClockIn,
Max(CASE WHEN LogType = 1 THEN addat END) ClockOut
from #MyTempTable
Group by employeeId, convert(date,addat)
在考勤系统中,很多用户在使用考勤机时,会出现两次以上(针对clockIn
)和两次以上(针对clockOut
)的印记错误.所以我有一个 table 获取所有用户“重复”的所有记录(ClockIn
和 ClockOut
)。
我正在寻找一种方法来仅获取 clockout
的 max
和 clockIn
的 min
。
我在 Whosebug 上看到了这个问题的解决方案:
我已经测试过了,它给出了预期的结果,但并非在所有情况下都如此。
1/ Table 我创建的架构和 select 查询:
在我的例子中,我有一个包含 employee_records 的 table,我想在同一日期只得到一个 ClockIn
和 ClockOut
。
employeerecordId AddAt logtype
我真正需要的是获取两个日期(持续时间)之间的所有 clockIn 和 clockOut(同一天只有一个 clock 和一个 clockOut)
我该怎么做?
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/ 样本 table 数据以测试所提出的解决方案 here
创建 table 并在其上插入数据:
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
将return:
预期结果:
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
您似乎想按员工和日期分组,然后使用条件聚合拆分签到和签退。
select
employeeId,
convert(date,addat) Date,
Min(CASE WHEN LogType = 0 THEN addat END) ClockIn,
Max(CASE WHEN LogType = 1 THEN addat END) ClockOut
from #MyTempTable
Group by employeeId, convert(date,addat)