Próbuję uzyskać liczbę dni między dwiema różnymi datami, z wyjątkiem weekendów.
Nie wiem, jak osiągnąć ten wynik.
postgresql
datetime
pragati basa
źródło
źródło
Odpowiedzi:
Zakładając, że przez „weekend” rozumiesz sobotę i niedzielę , może to być jeszcze prostsze:
Nie potrzebujesz dodatkowego poziomu podkwerend dla
generate_series()
. SRF (zestaw funkcji zwracających), zwany także „funkcjami tabel”, może być używany tak jak tabele wFROM
klauzuli.Należy zwrócić uwagę w szczególności, że
generate_series()
zawiera górną granicę na wyjściu, o ile pasuje pełny przedział (3. parametr). Górna granica jest wykluczona tylko wtedy, gdy ostatni interwał zostanie skrócony, co nie ma miejsca w przypadku pełnych dni.Ze wzorem
ISODOW
dla EXTRACT () niedziele są zgłaszane jako7
zgodnie ze standardem ISO. Pozwala na prostszyWHERE
warunek.Raczej połączenie
generate_series()
ztimestamp
wejściem. Oto dlaczego:count(*)
jest nieco krótszy i szybszy niżcount(the_day)
, robiąc to samo w tym przypadku.Aby wykluczyć dolną i / lub górną granicę, odpowiednio dodaj / odejmij 1 dzień. Zazwyczaj możesz dołączyć dolną i wykluczyć górną granicę:
źródło
W tym przykładzie wymieniono wszystkie daty między 2013-12-15 a 2014-01-02 (włącznie). Druga kolumna podaje dzień tygodnia (numerycznie, od 0 do 6). Trzecia kolumna wskazuje, czy dniem tygodnia jest sobota / niedziela, czy nie (musisz dostosować to, co uważasz za weekend) i to, co można wykorzystać do zliczania dni tygodnia.
źródło
Zakładając, że weekend jest sobota i niedziela, możesz użyć następującego kodu SQL.
Zastąp daty swoimi wyborami, a (0,6) dniami tygodnia, które chcesz wykluczyć.
Kilka rzeczy, na które musisz zwrócić uwagę: -
Nie wspominałeś, jaką wersję PostgreSQL używasz. Działa to na wersji 9.1+, ale powinno działać na niższych wersjach.
Wybrane daty są uwzględniane przy korzystaniu z generowania_serwisów. Więc jeśli chcesz dni pomiędzy, dodaj 1 dzień do każdej daty.
źródło
Jest kilka rzeczy, które możesz zrobić, aby to ułatwić. Metodą, której użyłbym, byłoby upewnienie się, że tabela dat jest dostępna. Możesz szybko utworzyć taki:
Po utworzeniu tabeli powinieneś być w stanie stosunkowo szybko zapełnić ją danymi daty.
Następnie możesz napisać zapytanie jako szybką liczbę rekordów z tej tabeli.
źródło
Sugeruję, abyś utworzył funkcję do użycia w dowolnym momencie i pisze mniej; )
Powyższy kod utworzy funkcję sql, która zlicza i zwraca liczbę dni weekendowych (sobota, niedziela). Właśnie w ten sposób będziesz mieć większą elastyczność korzystania z tej funkcji.
Następnie możesz użyć tej funkcji, aby zwrócić tylko liczbę dni weekendowych w odstępie. Oto przykład do użycia:
Ta selekcja musi zwrócić cztery, ponieważ pierwszy i drugi dzień to poniedziałek, a mamy między nimi 2 soboty i 2 niedziele.
Teraz, aby zwrócić tylko dni robocze (bez weekendów), jak chcesz , po prostu odejmij, jak w poniższym przykładzie:
źródło
źródło