我的表(出席)包含员工的出勤情况,如下
EMPNO DATE
2 07/11/2016
2 07/12/2016
3 07/12/2016
6 07/13/2016
7 07/13/2016
其中包含员工编号(empno)和出勤日期(date)
另一个表(EMPLOYEES)包含公司中的所有员工,例如这样
EMPNO NAME
1 Musa
2 Ali
3 Khalid
6 James
7 Sara
我可以使用此代码查找员工在特定日期是否缺勤
select empno
from EMPLOYEES
where empno not in (select empno
from ATTENDANCE
where date = '07/11/2016')
我想检索特定范围内任意一天的缺勤员工列表
我尝试使用此查询
select empno
from EMPLOYEES
where empno not in (select empno
from ATTENDANCE
where date between '07/11/2016' and '07/13/2016' )
但这会给我那些在此范围内所有天都缺勤的人,如果一名员工仅在一天缺勤,则不会检索它
我想要一个查询来检索员工号和员工缺勤的日期?
更新: 我也尝试过这个,正如sagi提到的
select empno
from EMPLOYEES
where empno not in (select empno
from ATTENDANCE
group by empno
having count(empno) = to_date(' 07/09/2016','mm,dd,rrrr') - to_date('07/13/2016','mm,dd,rrrr') )
这会起作用,但不会告诉我员工缺勤的日期
最佳答案
I want a query to retreive the empno and the date where the employee was absent
在这种情况下,您需要使用以下查询生成给定范围内的所有可能日期:
SELECT date '2016-07-11' + level - 1 As "DATE" from dual
CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1;
DATE
-----------------
16/07/11 00:00:00
16/07/12 00:00:00
16/07/13 00:00:00
然后使用交叉连接生成所有可能的对:date+employe
SELECT e.empno, d."DATE"
FROM (
SELECT date '2016-07-11' + level - 1 As "DATE" from dual
CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1
) d
CROSS JOIN empno e
然后使用外连接和 IS NULL 条件过滤掉现有记录(仅保留不存在的对:empno+date)
SELECT e.empno, d."DATE"
FROM (
SELECT date '2016-07-11' + level - 1 As "DATE" from dual
CONNECT BY LEVEL <= date '2016-07-13' - date '2016-07-11' + 1
) d
CROSS JOIN EMPLOYEES e
LEFT JOIN ATTENDANCE a
ON ( a.empno = e.empno AND a."DATE" = d."DATE" )
WHERE a."DATE" IS NULL
order by 1,2
关于sql - 如何在oracle sql中查找某个日期范围内缺失的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369019/