Aujourd'hui, on va encore plonger dans la manipulation des données temporelles, apprendre à en extraire des parties précises (genre l'année, le mois ou le jour de la semaine) avec la fonction EXTRACT() et voir comment calculer un âge ou un intervalle entre deux dates avec AGE().
Dans les vrais projets, tu dois souvent isoler des parties précises d'une date ou d'une heure. Par exemple :
- Séparer les commandes par année ou par mois ;
- Compter le nombre d'utilisateurs inscrits un certain jour de la semaine ;
- Analyser la durée entre deux événements.
Pour gérer ce genre de trucs, on utilise les fonctions EXTRACT() et AGE().
C'est quoi EXTRACT() ?
La fonction EXTRACT() te permet de sortir une partie précise d'une date ou d'un timestamp. Par exemple, tu peux choper l'année d'une date de naissance, le numéro du mois ou même le jour de la semaine.
Syntaxe :
EXTRACT(part FROM source)
part: la partie de la date que tu veux extraire. Ça peut êtreYEAR,MONTH,DAY,HOUR,MINUTE,SECONDet d'autres.source: le type de données temporelles d'où tu veux extraire l'info. Ça peut être une colonne, une constante ou le résultat d'une fonction.
Exemple 1 : extraire l'année, le mois et le jour
SELECT
EXTRACT(YEAR FROM '2024-11-15'::DATE) AS year_part,
EXTRACT(MONTH FROM '2024-11-15'::DATE) AS month_part,
EXTRACT(DAY FROM '2024-11-15'::DATE) AS day_part;
Résultat :
| year_part | month_part | day_part |
|---|---|---|
| 2024 | 11 | 15 |
Ici, on a extrait l'année, le mois et le jour de la date 2024-11-15. Cette méthode est super utile quand tu veux grouper des données par parties de date.
Exemple 2 : jour de la semaine et heure à partir d'une heure
SELECT
EXTRACT(DOW FROM '2024-11-15'::DATE) AS day_of_week,
EXTRACT(HOUR FROM '15:30:00'::TIME) AS hour_part;
Résultat :
| day_of_week | hour_part |
|---|---|
| 3 | 15 |
DOW(Day of Week) te donne le numéro du jour de la semaine : dimanche —0, lundi —1, etc.HOURextrait l'heure d'une valeur temporelle.
Exemple 3 : appliquer sur des colonnes
Si t'as une table avec des dates, tu peux extraire des parties de ces dates pour faire de l'analyse. Imaginons une table orders :
| order_id | order_date |
|---|---|
| 1 | 2023-05-12 14:20 |
| 2 | 2023-06-18 10:45 |
| 3 | 2023-07-22 21:15 |
SELECT
order_id,
EXTRACT(MONTH FROM order_date) AS month,
EXTRACT(DAY FROM order_date) AS day
FROM orders;
Résultat :
| order_id | month | day |
|---|---|---|
| 1 | 5 | 12 |
| 2 | 6 | 18 |
| 3 | 7 | 22 |
C'est quoi AGE() ?
La fonction AGE() sert à calculer la différence entre deux timestamps. Par exemple, tu peux calculer l'âge d'un client à partir de sa date de naissance ou savoir combien de temps s'est écoulé depuis une commande.
Syntaxe :
AGE(timestamp1, timestamp2)
timestamp1: le timestamp le plus récent.timestamp2: le timestamp le plus ancien.- Si tu mets qu'un seul paramètre, PostgreSQL compare automatiquement avec la date actuelle (
NOW()).
Exemple 1 : calculer un âge
SELECT AGE('2025-11-15'::DATE, '1990-05-12'::DATE) AS age;
Résultat :
| age |
|---|
| 35 years 6 mons |
Dans cet exemple, tu vois l'âge d'une personne née le 12 mai 1990 au 15 novembre 2025.
Exemple 2 : intervalle entre deux événements
SELECT AGE('2023-06-01 15:00'::TIMESTAMP, '2023-05-20 10:30'::TIMESTAMP) AS duration;
Résultat :
| duration |
|---|
| 11 days 4:30:00 |
Ici, on a calculé l'intervalle entre deux événements. Pratique pour savoir combien de temps s'est passé entre le début et la fin d'une tâche.
Exemple 3 : âge d'un client
Imaginons une table customers :
| customer_id | birth_date |
|---|---|
| 1 | 1992-03-10 |
| 2 | 1985-07-07 |
On peut calculer l'âge des clients :
SELECT
customer_id,
AGE(NOW(), birth_date) AS age
FROM customers;
Résultat au 13 juin 2025 :
| customer_id | age |
|---|---|
| 1 | 33 years 3 mons |
| 2 | 39 years 11 mons |
Bien sûr, chez toi la valeur de NOW() et le résultat seront différents.
Exemples pratiques d'utilisation de EXTRACT() et AGE()
Maintenant, on combine les fonctions dans des scénarios réels.
Exemple 1 : grouper les données par mois
Imaginons une table de commandes avec des dates. Pour compter les commandes par mois, tu peux utiliser cette requête :
SELECT
EXTRACT(MONTH FROM order_date) AS order_month,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;
Exemple 2 : jours restants avant expiration
Imaginons une table subscriptions :
| subscription_id | expiry_date |
|---|---|
| 1 | 2023-12-31 |
| 2 | 2024-05-15 |
On veut savoir combien de jours il reste avant la fin de l'abonnement :
SELECT
subscription_id,
AGE(expiry_date, NOW()) AS time_remaining
FROM subscriptions;
Résultat :
| subscription_id | time_remaining |
|---|---|
| 1 | 1 mons 15 days |
| 2 | 6 mons |
Erreurs fréquentes et comment les éviter
Quand tu utilises EXTRACT() et AGE(), les débutants tombent parfois sur des pièges :
- Essayer d'extraire une partie qui n'existe pas, genre les mois à partir d'un
TIME. Retiens : les partiesYEAR,MONTHetDAYmarchent avecDATE,TIMESTAMP, mais pas avecTIME. - Problèmes de formats de données temporelles différents. Par exemple, la chaîne
2023/11/15n'est pas reconnue comme une date. Utilise le cast avec::DATEouTO_DATE(). - La différence entre
AGE()et la soustraction de timestamps. Si tu veux un intervalle précis (en mois, jours, secondes) — utiliseAGE(), mais pour juste le nombre de jours, une opération arithmétique suffit.
Voilà, t'as tout ce qu'il faut pour extraire et analyser des parties de données temporelles dans PostgreSQL. Amuse-toi à tester EXTRACT() et AGE() dans tes projets !
GO TO FULL VERSION