sql >> Database >  >> RDS >> PostgreSQL

Hoe tel je dagen behalve zondag tussen twee datums in Postgres?

U moet "tussen twee datums" definiëren dichter. Onder- en bovengrens inbegrepen of uitgesloten? Een algemene definitie zou zijn om op te nemen de onderste en uitsluiten de bovengrens van een interval. Definieer bovendien het resultaat als 0 wanneer de onder- en bovengrens identiek zijn. Deze definitie valt samen met het aftrekken van de datum precies .

SELECT date '2017-01-31' - date '2017-01-01' AS days_between

Deze exacte definitie is belangrijk voor het uitsluiten van zondagen. Voor de gegeven definitie bevat een interval van Zon - Zon (1 week later) geen bovengrens, dus is er slechts 1 Zondag om af te trekken.

interval in days  | sundays
0                 | 0
1-6               | 0 or 1
7                 | 1
8-13              | 1 or 2
14                | 2
...

Een interval van 7 dagen omvat altijd precies één zondag.

We kunnen het minimale resultaat krijgen met een gewone integer-deling (dagen / 7 ), waardoor het resultaat wordt afgekapt.

De extra zondag voor de rest van 1 - 6 dagen is afhankelijk van de eerste dag van de pauze. Als het een zondag is, bingo; als het een maandag is, jammer. Enz. We kunnen hier een eenvoudige formule uit afleiden:

SELECT days, sundays, days - sundays AS days_without_sundays
FROM  (
   SELECT z - a AS days
      , ((z - a) + EXTRACT(isodow FROM a)::int - 1 ) / 7 AS sundays
   FROM  (SELECT date '2017-01-02' AS a       -- your interval here
               , date '2017-01-30' AS z) tbl
   ) sub;

Werkt voor elke gegeven interval.
Opmerking:isodow , niet dow voor EXTRACT() .

Om op te nemen de bovengrens, vervang gewoon z - a met (z - a) + 1 . (Zou werken zonder haakjes, vanwege de operatorprioriteit, maar wees duidelijk.)

Prestatiekenmerk is O(1) (constant) in tegenstelling tot een voorwaardelijk aggregaat over een gegenereerde set met O(N) .

Gerelateerd:

  • Hoe bepaal ik de laatste dag van de vorige maand met PostgreSQL?
  • Bereken de werkuren tussen 2 datums in PostgreSQL


  1. Oracle Converteer TIMESTAMP met tijdzone naar DATE

  2. Tips voor het migreren van eigen naar open source databases

  3. Mijn favoriete PostgreSQL-extensies - deel twee

  4. Proberen de Oracle-ADF-toepassing te implementeren op Tomcat 7