查找数据表中不存在条目的日期
Find days where no entry exists in datatable
我有一个数据表,其中包含每个员工的日期列表,一个员工的示例:
employee date
emp1 Monday 3rd 10am
emp1 Monday 3rd 12am
emp1 Monday 3rd 3pm
emp1 Tuesday 4th 9am
emp1 Wednesday 5th 2pm
emp1 Friday 6th 10am
emp1 Saturday 7th 10am
在我的示例中缺少星期四。
我想看看周一到周五有没有哪一天没有记录。
每个员工一天可以有多个记录,周末也可以有记录。所以计算记录没有帮助。我可以看到一种非常缓慢的方法是循环 5 次并检查直到找到每个工作日;并为每位员工重复。有没有更好的方法?
解决方法可能是:
从数据库中获取所有数据。
然后对于每个员工,使用字符串匹配(使用正则表达式)到 select 所有天数并计算特定日期的条目数。如果 7 天计数中的任何一天为 0,那么您可以得出结论,特定日期没有该特定员工的记录。
这个 sql 应该给你一个员工的数据表,每周,他们没有在数据库中记录 5 个工作日:
select emp_id, week_no, count(*)
from
(select distinct emp_id,datepart(ww, work_Date) week_no, datepart
(dw,work_Date) weekday
from dates_table
where datepart(dw,pet_work_Date) in (2,3,4,5,6 )) as v
group by emp_id, week_no
having count(*) < 5;
此 sql 将提供一个信息更丰富的数据表,用于确定缺少哪一天:
select emp_id, week_no,
sum(mon_present) mon_present,
sum(tue_present) tue_present,
sum(wed_present) wed_present,
sum(thu_present) thu_present,
sum(fri_present) fri_present,
count(*)
from
(select distinct emp_id,datepart(ww, work_Date) week_no, datepart(dw,work_Date) weekday ,
case when datepart(dw,work_Date) = 2 then 1 else 0 end mon_present,
case when datepart(dw,work_Date) = 3 then 1 else 0 end tue_present,
case when datepart(dw,work_Date) = 4 then 1 else 0 end wed_present,
case when datepart(dw,work_Date) = 5 then 1 else 0 end thu_present,
case when datepart(dw,work_Date) = 6 then 1 else 0 end fri_present
from dates_table_test
where datepart(dw,work_Date) in (2,3,4,5,6 )) as v
group by emp_id, week_no
having count(*) < 5
;
我有一个数据表,其中包含每个员工的日期列表,一个员工的示例:
employee date
emp1 Monday 3rd 10am
emp1 Monday 3rd 12am
emp1 Monday 3rd 3pm
emp1 Tuesday 4th 9am
emp1 Wednesday 5th 2pm
emp1 Friday 6th 10am
emp1 Saturday 7th 10am
在我的示例中缺少星期四。 我想看看周一到周五有没有哪一天没有记录。
每个员工一天可以有多个记录,周末也可以有记录。所以计算记录没有帮助。我可以看到一种非常缓慢的方法是循环 5 次并检查直到找到每个工作日;并为每位员工重复。有没有更好的方法?
解决方法可能是:
从数据库中获取所有数据。
然后对于每个员工,使用字符串匹配(使用正则表达式)到 select 所有天数并计算特定日期的条目数。如果 7 天计数中的任何一天为 0,那么您可以得出结论,特定日期没有该特定员工的记录。
这个 sql 应该给你一个员工的数据表,每周,他们没有在数据库中记录 5 个工作日:
select emp_id, week_no, count(*)
from
(select distinct emp_id,datepart(ww, work_Date) week_no, datepart
(dw,work_Date) weekday
from dates_table
where datepart(dw,pet_work_Date) in (2,3,4,5,6 )) as v
group by emp_id, week_no
having count(*) < 5;
此 sql 将提供一个信息更丰富的数据表,用于确定缺少哪一天:
select emp_id, week_no,
sum(mon_present) mon_present,
sum(tue_present) tue_present,
sum(wed_present) wed_present,
sum(thu_present) thu_present,
sum(fri_present) fri_present,
count(*)
from
(select distinct emp_id,datepart(ww, work_Date) week_no, datepart(dw,work_Date) weekday ,
case when datepart(dw,work_Date) = 2 then 1 else 0 end mon_present,
case when datepart(dw,work_Date) = 3 then 1 else 0 end tue_present,
case when datepart(dw,work_Date) = 4 then 1 else 0 end wed_present,
case when datepart(dw,work_Date) = 5 then 1 else 0 end thu_present,
case when datepart(dw,work_Date) = 6 then 1 else 0 end fri_present
from dates_table_test
where datepart(dw,work_Date) in (2,3,4,5,6 )) as v
group by emp_id, week_no
having count(*) < 5
;