CodeGym /Cours /SQL SELF /Extraction des parties de date : EXTRACT() et AGE()

Extraction des parties de date : EXTRACT() et AGE()

SQL SELF
Niveau 31 , Leçon 2
Disponible

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 être YEAR, MONTH, DAY, HOUR, MINUTE, SECOND et 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.
  • HOUR extrait 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 parties YEAR, MONTH et DAY marchent avec DATE, TIMESTAMP, mais pas avec TIME.
  • Problèmes de formats de données temporelles différents. Par exemple, la chaîne 2023/11/15 n'est pas reconnue comme une date. Utilise le cast avec ::DATE ou TO_DATE().
  • La différence entre AGE() et la soustraction de timestamps. Si tu veux un intervalle précis (en mois, jours, secondes) — utilise AGE(), 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 !

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION