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 |