PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment compter les jours sauf le dimanche entre deux dates dans Postgres ?

Vous devez définir "entre deux dates" plus près. Borne inférieure et supérieure incluse ou exclue ? Une définition courante consisterait à inclure le plus bas et exclure borne supérieure d'un intervalle. De plus, définissez le résultat sur 0 lorsque les limites inférieure et supérieure sont identiques. Cette définition coïncide avec la soustraction de date exactement .

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

Cette définition exacte est importante pour exclure les dimanches. Pour la définition donnée, un intervalle de Sun - Sun (1 semaine plus tard) n'inclut pas la limite supérieure, il n'y a donc que 1 Dimanche à soustraire.

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

Un intervalle de 7 jours comprend toujours exactement un dimanche.

Nous pouvons obtenir le résultat minimum avec une simple division entière (jours / 7 ), ce qui tronque le résultat.

Le dimanche supplémentaire pour le reste de 1 à 6 jours dépend du premier jour de l'intervalle. Si c'est un dimanche, bingo; si c'est un lundi, tant pis. Etc. Nous pouvons en déduire une formule simple :

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;

Fonctionne pour tous intervalle donné.
Remarque :isodow , pas dow pour EXTRACT() .

Pour inclure la borne supérieure, il suffit de remplacer z - a avec (z - a) + 1 . (Fonctionnerait sans parenthèses, en raison de la priorité des opérateurs, mais mieux vaut être clair.)

La caractéristique de performance est O(1) (constante) par opposition à un agrégat conditionnel sur un ensemble généré avec O(N) .

Connexe :

  • Comment puis-je déterminer le dernier jour du mois précédent à l'aide de PostgreSQL ?
  • Calculer les heures de travail entre 2 dates dans PostgreSQL