Hirdetés

Új hozzászólás Aktív témák

  • nyunyu
    félisten

    én erre jutottam:
    1. generálom a következő napok dátumait
    2. ebből kidobom, ami szerepel a calendar táblában
    3. kilistázom a maradékból a munkanapokat, sorbarendezve
    4. a listából az n. elemet lekérdezem

    amiben nagyon más: van generátor függvény, ami többek között dátum típusra is működik, és az ünnepeket egy not in subselect halmazzal szedem ki.

    kb. így néz ki postgresql-ben:
    select l.nap,date_part('dow',l.nap),
         to_char(l.nap,'YYYYMMDD') as kompaktdatum from
    (select date_trunc('day',generate_series(now()+'1 day'::interval,
        now()+'30 days'::interval,'1 day'::interval)) as nap ) l
     where l.nap not in (select distinct date from calendar where date>now()
    and  date<now()+'30 days'::interval)
    and date_part('dow',l.nap) in (1,2,3,4,5) order by l.nap limit 1 offset 5;

    Nem elég azt nézni, hogy benne van-e a dátum a calendarban, hanem azt is kéne nézni, hogy az extra nap milyen napnak számít, különben elveszted a soknapos ünnepek körül elcserélt szombati munkanapokat.
    Ezért volt plusz egy oszlop az ügyfeleinknél használt naptár táblákban, ahova a munkanapcserés szombatokat is fel kellett vennem péntek értékkel, előtte pénteket meg csütörtökkel, amikor egy évre előre felvettem az ünnepnapokat.

    NOT IN vs LEFT JOIN?
    Annak idején úgy tanultuk, hogy jobb az anti join teljesítménye, de nem tudom ez a mai DB kezelőknél mennyire áll még fenn.
    Oracle optimalizálója alapból anti joinná alakítja a not in-t, hacsak nem tiltod meg neki, így ott már nincs különbség teljesítményben.

Új hozzászólás Aktív témák