PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abrufen der Anzahl bestimmter Wochentage (Wochenenden) aus dem Intervall in PostgreSQL

Die folgende Funktion gibt die Anzahl der vollen Wochenendtage zwischen zwei Daten zurück. Da Sie volle Tage benötigen, können Sie die Zeitstempel vor dem Aufruf der Funktion in Datumsangaben umwandeln. Es gibt 0 zurück, falls das erste Datum nicht genau vor dem zweiten liegt.

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;

Beispiele:

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

Um die Anzahl der Tage außer ganzen Wochenendtagen zu erhalten, subtrahieren Sie einfach die Anzahl der Tage von der obigen Funktion:

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