PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pobieranie liczby określonych dni tygodnia (weekendu) z interwału w PostgreSQL

Poniższa funkcja zwraca liczbę pełnych dni weekendowych między dwiema datami. Ponieważ potrzebujesz pełnych dni, możesz rzutować znaczniki czasu na daty przed wywołaniem funkcji. Zwraca 0 w przypadku, gdy pierwsza data nie jest ściśle przed drugą.

CREATE FUNCTION count_full_weekend_days(date, date)
  RETURNS int AS
$BODY$
  SELECT
    ($1 < $2)::int
      *
    (
      (($2 - $1) / 7) * 2
        + 
      (EXTRACT(dow FROM $1)<6 AND EXTRACT(dow FROM $2)>0 AND EXTRACT(dow FROM $1)>EXTRACT(dow FROM $2))::int * 2
        +
      (EXTRACT(dow FROM $1)=6 AND EXTRACT(dow FROM $2)>0)::int
        +
      (EXTRACT(dow FROM $2)=0 AND EXTRACT(dow FROM $1)<6)::int
    );
$BODY$
  LANGUAGE 'SQL' IMMUTABLE STRICT;

Przykłady:

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-10', '2009-04-20');
# returns 4

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-11', '2009-04-20');
# returns 3 (11th is Saturday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-12', '2009-04-20');
# returns 2 (12th is Sunday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');
# returns 2

Aby uzyskać liczbę dni z wyjątkiem pełnych dni weekendowych, po prostu odejmij liczbę dni z powyższej funkcji:

SELECT
  '2009-04-20'::date
    -
  '2009-04-13'::date
    -
   COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uruchomienie skryptu SQL przez psql powoduje błędy składniowe, które nie występują w PgAdmin

  2. Wiele niechcianych rekordów w Grupuj według klauzuli w Postgress

  3. Problemy z połączeniem pgAdmin3

  4. jak wyświetlić pełny kod procedury składowanej?

  5. Wysoka dostępność PostgreSQL dzięki architekturze Master-Slave i Master-Master