Temat: Dni robocze
Witam
Nie mogę nigdzie znaleźć informacji jak wyliczyć w postgres-ie ilość dni roboczych między dwoma datami.
Czy ktoś ma jakiś pomysł w jaki sposób to zrobić?
Z góry dzięki za odpowiedź
PostgreSQL to najbardziej zaawansowany system relacyjnych baz danych Open Source.
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
Witam
Nie mogę nigdzie znaleźć informacji jak wyliczyć w postgres-ie ilość dni roboczych między dwoma datami.
Czy ktoś ma jakiś pomysł w jaki sposób to zrobić?
Z góry dzięki za odpowiedź
Czym są dla ciebie dni robocze? Jak w tygodniu wypada swięto to jest dzień roboczy czy nie?
od poniedziałku do piątku, "czerwone" święto w kalendarzu to dzień wolny
My pobieramy takie dane z kalendarza systemu ERP, gdzie księgowość i planiści produkcji wpisują dni robocze.
No trochę cięzko byłoby zaimpementować Panom od postgresa coś takiego, bo każde Panstwo ma swoje swieta (poza kilkoma wspólnymi). Możesz sprawdzić czy dzień jest sobotą/niedzielą, świeta chyba będziesz musiał zapisywać w osobnej tabeli tym bardziej że zdarzają się święta ruchome.
Ostatnio edytowany przez adamleon (2009-08-31 22:32:31)
SELECT count(*) FROM generate_series(1, (higherdate::date - lowerdate::date)) i WHERE date_part(’dow’, higherdate::date + i) NOT IN (0,6);
Mam wątpliwości czy nie powinno być
SELECT count(*) FROM generate_series(0, (higherdate::date - lowerdate::date)) i WHERE
date_part(’dow’, lowerdate::date + i) NOT IN (0,6)
Ten select wypisuje ile jest dni poza sobotami a niedzielami w terminie od lowerdate do higherdate.
Funkcja generate_series służy do wygenerowania ciągu liczb z podanego zakresu a w kontekście polecenia select robi za petlę, za jej pomocą można przekazać ile razy ma sie wykonac select. Licznik tej pętli tutaj jest 'zapisywany' w 'i' i to 'i' jest wykorzytsane w warunku where do sprawdzenia czy data lowerdate+i nie jest czasem sobota (liczba 6) lub niedzielą (liczba 0). date_part służy do wyciągania części dat tutaj wyciągamy dow=day of a week (dow=0-niedziela, 1 -poniedzialek,...).
Mam nadzieje że nic nie pomieszalem a cos wyjasnilem.
Nie wiem czy dobrze robię
SELECT count(*) FROM generate_series(0, ('2009-06-01'::date - '2009-01-01'::date)) i WHERE
date_part(’dow’, '2009-01-01'::date + i) NOT IN (0,6)
dostaje taki błąd
ERROR: syntax error at or near ":"
LINE 1: ...ECT count(*) FROM generate_series(0, ('2009-06-01':date - '2...
^
Czy możesz to sprawdzić i napisać mi przykład który działa.
Z góry dzięki
U mnie to dziala, tylko nie wiem co masz za znaczki wokół dow bo u Ciebie to chyba nie sa apostrofy.
SELECT count(*) FROM generate_series(0, ('2009-06-01'::date - '2009-01-01'::date)) i WHERE date_part('dow', '2009-01-01'::date + i) NOT IN (0,6)
Poza tym sprawdź jeszcze jak masz ustawiony format daty
show datestyle;
data wg mnie ok ISO, YMD
dodam że działam na EMS SQL manager 2007 for Postgresql
dalej nie pasuje mu :: i pokazuje ten sam błąd co wcześniej ERROR: syntax error at or near ":"
kiedy z :: zrobię : pokazuje się okienko Input Parameters wpisuję datę 2009-02-02 i dostaje taki błąd
ERROR: operator is not unique: unknown - unknown
LINE 1: ...FROM generate_series(0, ('2009-06-01''2009-02-02' - '2009-01...
^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts.
dalej stoję w miejscu
To moze spróbuj tak zrzutować
SELECT count(*) FROM generate_series(0, (cast('2009-06-01' as date) - cast('2009-01-01' as date))) i WHERE date_part('dow', cast('2009-01-01' as date) + i) NOT IN (0,6)
Teraz działa, dzięki
teraz już wiem co to ::date
to tak też działa
SELECT count(*) FROM generate_series(0, (to_date('2009-06-30','YYYY-MM-DD') - to_date('2009-06-01','YYYY-MM-DD'))) i WHERE date_part('dow', to_date('2009-06-01','YYYY-MM-DD') + i) NOT IN (0,6)
Ostatnio edytowany przez adamleon (2009-09-01 11:20:09)
Posty [ 12 ]
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
[ Wygenerowano w 0.008 sekund, wykonano 7 zapytań ]