Как найти дни с пропуском данных в таблице?

Существует таблица, в которой каждый день автоматически записываются данные.
Таблица содержит столбец INSERT_DATE с типом DATE:

SELECT * FROM PERSON A
ORDER BY INSERT_DATE DESC

В один день произошла ошибка, в связи с которой, в таблицу не записывались данные. Необходимо выяснить, в какой день это произошло, т.е. хочу найти все пропущенные дни с 1/22/2021 до сегодняшнего дня.


Ответы (1 шт):

Автор решения: 0xdb

Допустим, есть такие данные:

create table tab (inserted) as
    select date'2021-01-01'+(rownum-1+0.5) 
    from dual connect by level<=31
/
delete from tab where trunc (inserted) in (date'2021-01-06', date'2021-01-28') 
/
2 rows deleted.

То есть, за январь два дня были ошибки.

Простое решение, составить последовательность дней за данный период, и проверять - были ли записи за каждый день в последовательности. Попробуйте такой запрос:

with dayseq (day) as (
    select daystart+level from (
        select min (trunc (inserted)) daystart, max (trunc (inserted)) dayend
        from tab) connect by daystart+level < dayend 
)
select day daywithoutrecords 
from dayseq seq
where not exists (
    select 1
    from tab   
    where trunc (tab.inserted) = seq.day
)
order by 1
/

DAYWITHOUTRECORDS
-------------------
2021-01-06 00:00:00
2021-01-28 00:00:00
→ Ссылка