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

Comment trouver l'intervalle entre deux dates dans PostgreSQL

Problème :

Vous aimeriez trouver la différence entre deux valeurs date/datetime dans une base de données PostgreSQL.

Exemple :

Notre base de données a une table nommée employment avec des données dans les colonnes id , first_name , last_name , start_date , et end_date :

identifiant prénom nom_de_famille date_début end_date
1 Barbara Wilson 2010-02-01 2018-10-30
2 Robert Anderson 2001-04-17 2011-12-20
3 Steven Nelson 2005-06-01 2019-09-23

Pour chaque employé, obtenons son nom et prénom et la différence entre les dates de début et de fin de son emploi. Nous voulons voir l'intervalle en années, mois et jours.

Solution 1 :

Nous utiliserons le AGE() une fonction. Voici la requête que vous écririez :

SELECT first_name, 
             last_name, 
             AGE(end_date, start_date) 
         AS  employment_interval 
FROM employment;

Voici le résultat de la requête :

prénom nom_de_famille employment_interval
Barbara Wilson 8 ans 8 mois 29 jours
Robert Anderson 10 ans 8 mois 3 jours
Steven Nelson 14 ans 3 mois 22 jours

Discussion :

Utilisez le PostgreSQL AGE() fonction pour récupérer l'intervalle entre deux horodatages ou dates. Cette fonction prend deux arguments :le premier est la date de fin et le second est la date de début. Dans notre exemple, nous utilisons la colonne end_date (c'est-à-dire lorsque l'employé a cessé de faire ce travail) et la colonne start_date (quand l'employé a commencé ce travail).

La différence entre les dates est renvoyée sous la forme d'un intervalle en années, mois, jours, heures, etc. La requête pour Steven Nelson a renvoyé la période d'emploi comme l'intervalle '14 years 3 months 22 days '; c'est la différence entre le 01/06/2005, lorsqu'il a commencé ce travail, et le 23/09/2019, lorsqu'il l'a arrêté.

Le AGE() La fonction peut également afficher la différence entre l'horodatage/la date actuels et le premier argument. Dans ce cas, la fonction n'a qu'un seul argument :

SELECT first_name,
             last_name,
             AGE(end_date)
         AS  employment_interval
FROM employment;

La requête ci-dessus affiche l'intervalle entre l'horodatage actuel (pour ce texte, il s'agit de "2019-09-26") et la date de fin de chaque employé (la colonne end_date ).

prénom nom_de_famille employment_interval
Barbara Wilson 10 mois 27 jours
Robert Anderson 7 ans 9 mois 6 jours
Steven Nelson 3 jours

Trois jours se sont écoulés entre le dernier jour de travail de Steven et l'horodatage actuel (au moment de la rédaction, c'est le 2019-09-26).

Solution 2 :

Vous pouvez également utiliser l'opérateur moins ( '-' ) au lieu de AGE() pour soustraire deux dates.

Voici la requête que vous écririez :

SELECT first_name,
             last_name,
             end_date::DATE – start_date::DATE 
         AS  employment_interval 
FROM employment;

Dans ce résultat, vous ne verrez que la différence en jours (et non en années, mois et jours) :

prénom nom_de_famille employment_interval
Barbara Wilson 3193
Robert Anderson 3899
Steven Nelson 5227