检查特定月份中是否存在日期

时间:2016-11-29 09:44:59

标签: oracle

以下是我的ATTENDANCE表中的一些示例行

    EMP_NO   RECORD_DATE CLOCKIN CLOCKOUT

    361      09-AUG-16 08:34:17 16:50:17
    361      11-AUG-16 09:09:22 17:32:45
    361      15-AUG-16 08:56:09 16:54:42
    361      22-AUG-16 08:21:58 16:54:43
    361      24-AUG-16 08:29:54 17:02:35
    361      26-AUG-16 08:46:42 19:02:40
    361      29-AUG-16 08:56:15 19:00:52
    361      31-AUG-16 08:31:31 19:00:38

我需要生成缺勤报告,因此我需要查找特定员工在日历月中不存在的所有日期。

我想到了。

SELECT MY_DATE FROM table_FOO 
  where MY_DATE NOT IN (SELECT RECORD_DATE FROM attendance WHERE emp_no='361')

有没有办法将所有日期调用到一个列中(这里是table_FOO中的my_date),它应与月份匹配。

请寻求帮助

3 个答案:

答案 0 :(得分:1)

要填充table_foo,您可以使用循环:

declare
  d date;
begin
  d := to_date('01-01-2016','dd-mm-yyyy');
  for i in 0..364 loop
    insert into table_foo values (d + i);
  end loop;
  commit;
end;

示例代码将填写当年的所有日期。

答案 1 :(得分:1)

假设列RECORD_DATE和MY_DATE的数据类型为DATETIMESTAMP(如果不是这种情况,则应考虑更改),查询可以如下:

SELECT MY_DATE 
FROM table_FOO 
where TRUNC(MY_DATE, 'MM') NOT IN 
   (SELECT TRUNC(RECORD_DATE, 'MM') FROM attendance WHERE emp_no='361')

答案 2 :(得分:1)

假设表table_fooattandence日期列具有same数据类型,您可以使用以下查询来创建我们的参与度报告。

SELECT MY_DATE
  FROM table_FOO
 WHERE NOT EXISTS (SELECT 1
                         FROM attendance
                        WHERE emp_no = '361'
                        and record_date = MY_DATE
                        and to_char(record_date,'mm') = <input_month_number > );

此处input_month_number可以是1 for Jan,依此类推.. 12 for Dec