1

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ź

2

Odp: Dni robocze

Czym są dla ciebie dni robocze? Jak w tygodniu wypada swięto to jest dzień roboczy czy nie?

3

Odp: Dni robocze

od poniedziałku do piątku, "czerwone" święto w kalendarzu to dzień wolny

4

Odp: Dni robocze

My pobieramy takie dane z kalendarza systemu ERP, gdzie księgowość i planiści produkcji wpisują dni robocze.

5

Odp: 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.

6

Odp: Dni robocze

Ostatnio edytowany przez adamleon (2009-08-31 22:32:31)

7

Odp: Dni robocze

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.

8

Odp: Dni robocze

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

9

Odp: Dni robocze

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;

10

Odp: Dni robocze

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

11

Odp: Dni robocze

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)

12

Odp: Dni robocze

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)