CodeGym /Cours /SQL SELF /Formatage des dates et heures : NOW(),

Formatage des dates et heures : NOW(), CURRENT_DATE, DATE_PART()

SQL SELF
Niveau 5 , Leçon 2
Disponible

Les dates et l'heure, ce ne sont pas juste des chiffres abstraits, c'est la clé d'une partie précieuse de tes données. Dans la vraie vie, tu croises les dates tout le temps : genre, analyser les ventes par mois, filtrer par date de naissance des employés ou comparer des intervalles de temps. Savoir manipuler les dates te permet de faire des requêtes plus flexibles et de sortir des analyses bien plus poussées.

Des exemples où bosser avec les dates, c'est super important :

  • Analyse des ventes pour un mois précis.
  • Compter le nombre d'utilisateurs inscrits sur la dernière année.
  • Créer des rapports sur des intervalles de temps (genre, revenus mensuels).

Dans PostgreSQL, t'as plein de fonctions pour gérer les dates, et là on va voir juste les plus utiles.

Fonctions principales pour bosser avec les dates et l'heure

La fonction NOW() te renvoie la date et l'heure actuelles du serveur de la base de données. Tu l'utilises quand tu veux choper l'heure exacte du moment. Par exemple : tu veux enregistrer l'heure de création d'une nouvelle ligne.

Syntaxe :
SELECT NOW();

Exemple de résultat :

2023-11-05 15:23:45.123456+00

Exemple d'utilisation : Tu veux insérer une commande avec la date et l'heure actuelles :

INSERT INTO orders (order_id, order_date, total_amount)
VALUES (1, NOW(), 150.00);
Commentaire : ici NOW() va automatiquement ajouter la date et l'heure actuelles dans la colonne order_date.

Comment marche exactement l'opérateur INSERT, tu verras ça dans les prochaines leçons :P

La fonction CURRENT_DATE

Si tu veux juste insérer la date du jour sans l'heure, utilise CURRENT_DATE. Ça te renvoie juste l'année, le mois et le jour.

Syntaxe :

SELECT CURRENT_DATE;

Exemple de résultat :

2023-11-05

Exemple d'utilisation : Disons que tu veux récupérer les lignes du jour :

SELECT *
FROM orders
WHERE order_date = CURRENT_DATE;
Commentaire : ici on compare la date de la colonne order_date avec la date du jour.

Un peu d'humour : NOW() c'est comme ton café au boulot : prêt tout de suite. Et CURRENT_DATE c'est comme le calendrier au mur : juste la date, sans les détails.

Extraire des parties de date avec DATE_PART()

La fonction DATE_PART() te permet de choper une partie précise d'une date, genre l'année, le mois, le jour, l'heure ou la minute. Pratique, par exemple, pour compter les commandes d'une année donnée ou trouver le jour de la semaine.

Syntaxe :

DATE_PART('partie', date)

Exemple :

SELECT DATE_PART('year', NOW()) AS current_year;

Exemple de résultat :

current_year
2025

Les parties de date que tu peux extraire :

  • year : année.
  • month : mois.
  • day : jour.
  • hour : heure.
  • minute : minute.
  • second : seconde.
  • dow : jour de la semaine (0 = dimanche).

Exemple 2 : On extrait le mois de la date du jour.

SELECT DATE_PART('month', CURRENT_DATE) AS current_month;

Résultat :

current_month
6

Tu peux utiliser DATE_PART() pour des calculs plus complexes. Par exemple :

Tu veux sélectionner seulement les utilisateurs nés cette année :

SELECT *
FROM students
WHERE DATE_PART('year', birth_date) = DATE_PART('year', CURRENT_DATE);

Exemple de résultat :

id first_name last_name birth_date grade
1 Otto Art 2025-03-12 9
2 Anna Pal 2025-07-08 8
3 Piu Wolf 2025-01-22 10
4 Eva Go 2025-09-30 7
5 Dan Sok 2025-06-14 9

Exemples pratiques

Dans certains exemples, tu verras des opérateurs que t'as pas encore étudiés. T'inquiète, bientôt tu les utiliseras les doigts dans le nez. Je veux juste te montrer plus de cas réels. Et puis, c'est pour te teaser un peu :)

Exemple 1 : Calculer l'âge d'un utilisateur

Imaginons qu'on a une table users avec la date de naissance de chaque utilisateur. On veut calculer leur âge.

Requête :

SELECT user_id, first_name, last_name, 
       DATE_PART('year', CURRENT_DATE) - DATE_PART('year', birth_date) AS age
FROM users;

On fait juste la soustraction entre l'année actuelle et l'année de naissance. C'est rapide, mais pas super précis pour l'âge.

Exemple de résultat :

user_id first_name last_name age
101 Alex Lin 25
102 Maria Chi 30
103 Tor Coz 22
104 Nat Ive 27
105 Don Sok 35

Exemple 2 : Filtrer par heure

Si tu veux sélectionner toutes les commandes passées dans la dernière heure :

SELECT *
FROM orders
WHERE order_date >= NOW() - INTERVAL '1 hour';

Tu vois, c'est super pratique d'utiliser INTERVAL (pour définir un intervalle de temps).

Exemple 3 : Grouper par mois

Tu veux compter le nombre de commandes pour chaque mois de l'année en cours :

SELECT DATE_PART('month', order_date) AS order_month, COUNT(*) AS order_count
FROM orders
WHERE DATE_PART('year', order_date) = DATE_PART('year', CURRENT_DATE)
GROUP BY DATE_PART('month', order_date)
ORDER BY order_month;

On groupe par numéro de mois, et le résultat est trié pareil.

Exemple de résultat :

order_month order_count
1 120
2 95
3 134
4 110
5 42

Exemple 4 : Extraire le jour de la semaine

Tu veux savoir quel jour de la semaine il y a eu le plus de commandes :

SELECT DATE_PART('dow', order_date) AS day_of_week, COUNT(*) AS order_count
FROM orders
GROUP BY DATE_PART('dow', order_date)
ORDER BY order_count DESC;

La commande DATE_PART('dow') te donne le jour de la semaine pour chaque commande sous forme de chiffre, où 0 = dimanche, 1 = lundi, etc. DOW c'est l'abréviation de DayOfWeek - jour de la semaine.

Exemple de résultat :

day_of_week order_count
5 210
4 190
3 175
2 160
1 140
6 120
0 95

Fais gaffe aux erreurs classiques

Travailler avec les dates, ça peut vite te donner mal à la tête à cause des bugs. Voilà quelques problèmes fréquents que tu risques de croiser :

Format de la date et de l'heure : quand tu utilises NOW() ou n'importe quelle fonction qui te renvoie une date avec l'heure, vérifie toujours son format. Par exemple, si tu compares order_date avec CURRENT_DATE, assure-toi que l'heure est ignorée ou bien précisée.

Date au format texte : souvent dans les bases, les dates sont stockées comme des chaînes (genre texte). Si tu essaies d'utiliser des fonctions pour les dates (genre DATE_PART()), tu vas avoir une erreur. Vérifie que tes données sont bien du type DATE ou TIMESTAMP.

Différents fuseaux horaires : si ton serveur tourne dans un fuseau horaire et que les données viennent d'un autre, ça peut vite devenir le bazar. Pense à utiliser le type TIMESTAMPTZ pour gérer les fuseaux horaires.

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