/ / Oracle - Знайдіть усі дати, які відсутні в таблиці - sql, oracle, date

Oracle - Знайти всі дати, які відсутні в таблиці - sql, oracle, date

У нас є таблиця зі стовпцем DATE. Як ми можемо написати сценарій, який повертає будь-які дати вихідних (субота чи неділя) протягом наступних n років, коли у нас НЕ вказана дата вихідних у таблиці?

Відповіді:

6 за відповідь № 1

Щоб отримати всі вихідні дні від сьогодні до сьогодні + 365 днів:

select as_of_date
from
(
select
rownum,
sysdate + rownum - 1 as as_of_date
from dual
connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, "DY", "nls_date_language=AMERICAN") in ("SAT", "SUN")

Щоб виключити дати, які присутні в даній таблиці, просто додайте "і не існує (виберіть 1 із свого_таблиці y, де y.the_date = as_of_date)" або подібних, наприклад:

select as_of_date
from
(
select
rownum,
sysdate + rownum - 1 as as_of_date
from dual
connect by rownum <= (sysdate+365) - sysdate
) sub
where to_char(as_of_date, "DY", "nls_date_language=AMERICAN") in ("SAT", "SUN")
and not exists (select 1 from my_table myt where myt.as_of_date = sub.as_of_date)

Це може бути спрощено, щоб не використовувати підзапит, просто змініть виникнення стовпця "as_of_date" на "sysdate + rownum - 1", і ви повинні бути хорошими

Варто також зазначити, що я використав цей запитколи мені потрібно було отримати всі побачення, а не лише вихідні. Що я зробив у відповіді, було лише виключити вихідні у зовнішньому запиті. Якщо ви не хочете повертати непотрібні дані, я впевнений, що внутрішній запит можна змінити так, щоб він не проходив через 365 днів, а лише через кількість вихідних днів (тобто використовуйте, коли rownum <365/5 та отримати дату + ( 6,7) починаючи з суботи чи неділі), але я не думаю, що це велика проблема продуктивності, тому я не хвилювався з цього приводу


1 для відповіді № 2

Таких питань виникає багато питань. Вони, як правило, передбачають створення певної послідовності та відображення її назад.

Натомість, якщо ви можете жити з пошуком пропущеної дати, що слідує за кількістю пропущених дат підряд, то щось подібне буде працювати:

select t.date+7, (nextdowdate - t.date)/7 as nummissing
from (select t.date, lead(t.date) over (partition by to_char(t.date, "Dy") order by date) as nextdowdate
from t
where to_char(t.date, "Dy") in ("Sat", "Sun")
) t
where nextdowdate - t.date > 7 and
date between FirstDate and LastDate

Це передбачає, що перша дата присутняі що дані поширюються після останньої дати. В основному, це пошук розривів між датами, потім просування вперед на тиждень і підрахунок тривалості розриву.