sql >> Database teknologi >  >> RDS >> PostgreSQL

Hent antallet af bestemte dage i ugen (weekend) fra interval i PostgreSQL

Følgende funktion returnerer antallet af hele weekenddage mellem to datoer. Da du har brug for hele dage, kan du caste tidsstemplerne til datoer, før du kalder funktionen. Det returnerer 0, hvis den første dato ikke er strengt før den anden.

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;

Eksempler:

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

For at få antallet af dage undtagen hele weekenddage skal du blot trække antallet af dage fra funktionen ovenfor:

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


  1. MySql fuld join (union) og bestilling på flere datokolonner

  2. Hvordan opretter man forbindelse til mssql ved hjælp af pdo gennem PHP og Linux?

  3. MySql Sådan bruges DATE_SUB i Between-klausulen

  4. MySQL vs fildatabaser