wtorek, 21 kwietnia 2015

Brakujące dni w Oraclu

Któryś raz piszę to samo zapytanie, więc postanowiłem zapisać to rozwiązanie na blogu. Może Ci się przyda - mi na pewno :)

Przypuśćmy, że masz tabelę (o nazwie tableWithDate), która ma kolumnę z datą (dateToCheck). Ładujesz dane i zapisujesz dzień na które dane zostały załadowane. Na końcu ładowania danych powinieneś mieć wypełnioną tabelę z dla każdego dnia od 1 stycznia 2014. Chciałbyś sprawdzić dla jakich dni nie zostały załadowane dane.

Pomocne nam będą funkcje do operowania na dacie. Same zapytanie wygląda następująco:

WITH dates as (
    SELECT TRUNC(to_date('1/1/2014','DD/MM/YYYY')) -1 +  LEVEL AS d
    FROM DUAL
    CONNECT BY LEVEL <= 365
    )

SELECT  
d As "Date", 
to_char(d, 'DDD') As "DayOfYear",
to_char(d, 'Day') as "DayOfWeek", 
to_char(d, 'WW') As "WeekOfYear",
to_char(d, 'Month') As "MonthName", 
to_char(d, 'RM') As "Roman" ,
to_char(d, 'Q') As "Quarter"

FROM dates d
where  NOT  EXISTS (
    SELECT  tab.dateToCheck
    from tableWithDate tab
    where to_char(d.d, 'YYYYMMDD')  = to_char(tab.dateToCheck, 'YYYYMMDD')
    group by tab.dateToCheck
)
ORDER BY d
;
Do wyświetlenia daty pomocna nam będzie funkcja to_char z formatowaniem. Jeżeli nie będziemy mieli załadowanych danych to wynik zapytania będzie wyglądał następująco:
Jeżeli załadujemy dane i w śród tych danych nie będzie danych dla dni: 1-3 i 6 listopada, to tak będzie wyglądał wynik zapytania:


Brak komentarzy:

Prześlij komentarz