/ / Oracle - Nájsť všetky dáta, ktoré nie sú v tabuľke - sql, oracle, dátum

Oracle - Nájdite všetky dátumy, ktoré nie sú v tabuľke - sql, Oracle, dátum

Máme tabuľku so stĺpcom DATE. Ako môžeme napísať scenár, ktorý vráti všetky víkendové termíny (sobota alebo nedeľa) počas nasledujúcich n rokov, kde nemáme uvedený dátum víkendu v tabuľke?

odpovede:

6 pre odpoveď č. 1

Ak chcete získať všetky víkendy medzi dneškom a dnes + 365 dní:

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")

Ak chcete vylúčiť dátumy, ktoré sú prítomné v danej tabuľke, jednoducho pridajte "a neexistuje (vyberte 1 z your_table y kde y.the_date = as_of_date)" alebo podobné, napríklad:

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)

Je možné zjednodušiť použitie poddotazu, stačí zmeniť výskyt stĺpca "as_of_date" na "sysdate + rownum - 1" a mali by ste byť dobrí

Je tiež potrebné poznamenať, že som použil tento dotazkeď som potreboval dostať všetky dátumy, a nie len cez víkendy. Čo som urobil v odpovedi bolo len vylúčiť víkendy vo vonkajšom najviac dotaz. Ak nechcete, aby sa vrátili nepotrebné údaje, som si istý, že väčšinu vnútorných dopytov možno zmeniť tak, aby neprekročili 365 dní, ale iba cez počet víkendov (tj použitie, kde rownum <365/5 a dátum načítania + ( 6,7) začína v sobotu alebo v nedeľu), ale nemyslím si, že je to veľký problém s výkonom, takže som sa o to nemusel starať


1 pre odpoveď č. 2

Tieto typy otázok prichádzajú veľa. Vo všeobecnosti zahŕňajú vytvorenie sekvencie určitého druhu a jeho mapovanie späť.

Ak môžete žiť s nájdením chýbajúceho dátumu podľa počtu chýbajúcich dátumov v rade, potom bude fungovať niečo ako:

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

Predpokladá sa, že je prítomný prvý dátuma že údaje presahujú posledný dátum. V podstate je to hľadanie medzier medzi dátumami, potom posun o jeden týždeň dopredu a počítanie dĺžky medzery.