sql - 如何在oracle sql中查找某个日期范围内缺失的数据

标签 sql oracle

我的表(出席)包含员工的出勤情况,如下

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/

相关文章:

mysql - 选择一个值,其中另一列具有最高值

sql - 在 postgresql 中创建一个父项或一组父项的所有子项的表

sql - 更改Oracle中数字列的精度

excel - Oracle:ORA-12154:TNS 问题:Excel 64 位/Windows 10 64 位

sql - sql server中基于BETWEEN运算符编写case语句

sql - 如果有一个字段的值应该有不同的类型怎么办?

sql - 使用不同的表空间从查询创建表(Oracle SQL)

database - 提供正确的用户名和密码,得到 ORA-01017 : invalid username/password; logon denied

sql - ORACLE SQL CASE语句-出现错误

sql - 从列子集计算最小记录版本集