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.
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.
GO TO FULL VERSION