L’entraînement dure une heure et demie, la journée de taf — 8 heures, la pause — 20 minutes, et faire cuire des œufs prend 10 minutes. Tout ça, c’est des intervalles de temps.
Les intervalles de temps sont super utiles dans les applis réelles, genre quand tu dois calculer les délais d’exécution des tâches, trouver la différence entre deux dates ou ajouter/soustraire du temps. Mais avant d’aller plus loin, petit rappel de ce qu’on a vu dans les cours précédents.
Dans PostgreSQL, INTERVAL c’est un type de données spécial fait pour représenter des périodes de temps. Contrairement aux autres types temporels, il ne stocke pas une date ou une heure précise, mais décrit une durée, genre : "2 jours", "3 heures", "5 minutes".
Syntaxe de INTERVAL
Tu peux définir un intervalle comme ça :
INTERVAL 'nombre unité_de_temps'
Exemples :
INTERVAL '2 days' -- Deux jours
INTERVAL '3 hours' -- Trois heures
INTERVAL '15 minutes' -- Quinze minutes
INTERVAL '1 day 2 hours' -- Un jour et deux heures
PostgreSQL gère plein d’unités de temps différentes : year, month, day, hour, minute, second. Tu peux les combiner dans la même expression.
Utiliser les intervalles dans les requêtes
Le type INTERVAL devient vraiment cool quand tu le combines avec d’autres types temporels (DATE, TIMESTAMP). On va voir les opérations de base.
Ajouter un intervalle à une date/heure
Tu peux ajouter des intervalles à des valeurs de date ou d’heure. Par exemple :
SELECT CURRENT_DATE + INTERVAL '7 days' AS delivery_date;
-- On obtient la date dans 7 jours à partir d’aujourd’hui
Résultat :
| delivery_date |
|---|
| 2023-10-08 |
Soustraire des intervalles d’une date/heure
En plus d’ajouter, tu peux aussi soustraire des intervalles :
SELECT NOW() - INTERVAL '2 hours' AS two_hours_ago;
-- On obtient l’heure qu’il y a deux heures
Résultat :
| two_hours_ago |
|---|
| 2023-10-01 10:00:00.000 |
Calculer la différence entre deux dates
Une des fonctions puissantes de INTERVAL, c’est de calculer la différence entre deux dates :
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS days_difference;
-- Combien de jours entre deux dates
Résultat :
| days_difference |
|---|
| 14 days |
Fais gaffe, le résultat ici est aussi un intervalle de temps.
Exemples pratiques avec INTERVAL
Calcul de la date de livraison. Imagine une boutique en ligne où la livraison prend de 3 à 7 jours. Voilà comment tu peux calculer les dates de livraison possibles :
SELECT CURRENT_DATE + INTERVAL '3 days' AS earliest_delivery,
CURRENT_DATE + INTERVAL '7 days' AS latest_delivery;
Résultat :
| earliest_delivery | latest_delivery |
|---|---|
| 2023-10-04 | 2023-10-08 |
Prendre en compte la durée d’une tâche. Imaginons qu’on a une table tasks où chaque tâche a une date de début. On veut calculer la date de fin de la tâche en fonction de sa durée en heures :
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('Préparer le rapport', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('Tester l’application', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
Résultat :
| task_name | start_time | end_time |
|---|---|---|
| Préparer le rapport | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| Tester l’application | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
Comparer les durées d’exécution. Parfois, tu veux trouver toutes les tâches qui ont pris moins de 3 heures :
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
Résultat :
| task_name |
|---|
| Tester l’application |
Trucs utiles avec les intervalles
Calcul dynamique d’intervalles. Tu peux combiner les intervalles avec d’autres opérations. Par exemple, prendre le nombre de jours d’une colonne et le convertir en intervalle :
SELECT CURRENT_DATE + (order_days || ' days')::INTERVAL AS order_due_date
FROM orders;
Caster un intervalle en texte. Parfois, tu veux convertir un intervalle en texte pour l’afficher :
SELECT INTERVAL '2 days 3 hours'::TEXT AS interval_text;
Résultat :
| interval_text |
|---|
| 2 days 03:00:00 |
Erreurs fréquentes avec INTERVAL
Travailler avec INTERVAL, même si c’est puissant, peut parfois être galère. Une erreur classique — utiliser un mauvais format. Par exemple, si tu fais INTERVAL '2 hours and 30 minutes', tu vas avoir une erreur, parce que PostgreSQL pige pas le mot "and". La bonne façon : INTERVAL '2 hours 30 minutes'.
Une autre erreur — oublier de préciser l’unité de temps, genre INTERVAL '2'. PostgreSQL sait pas ce que c’est ce "2", donc indique toujours l’unité (2 days, 2 hours).
GO TO FULL VERSION