CodeGym /Cours /SQL SELF /Arrondir et tronquer les données temporelles : DAT...

Arrondir et tronquer les données temporelles : DATE_TRUNC()

SQL SELF
Niveau 32 , Leçon 0
Disponible

DATE_TRUNC() — c'est un outil puissant qui te permet de tronquer des valeurs temporelles à une unité de temps précise. Par exemple, tu peux arrondir un timestamp au début du jour, du mois, de l'année, de l'heure, et ainsi de suite. C'est super utile quand tu analyses des données par période (genre, si tu veux grouper les commandes par jour, mois ou année).

Imagine une date et une heure comme une longue chaîne de texte, où t'as les heures, minutes, secondes. La fonction DATE_TRUNC() prend cette chaîne et "coupe" tout ce qui est en trop, en gardant juste la partie qui t'intéresse. Par exemple :

  • Tu veux tronquer la date 2023-10-01 15:30:45 au début du jour. Le résultat sera 2023-10-01 00:00:00.
  • Ou tu veux garder juste la première seconde de l'heure, donc 2023-10-01 15:00:00.

Syntaxe

La syntaxe de la fonction DATE_TRUNC() ressemble à ça :

DATE_TRUNC(field, source)
  • field — c'est l'unité de temps à laquelle tu veux "couper" la date. Par exemple, year, month, day, hour, minute.
  • source — c'est la valeur temporelle que tu veux tronquer. Ça peut être une colonne de type TIMESTAMP ou le résultat d'une autre fonction, genre NOW().

Exemple d'appel simple :

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- Résultat : 2023-10-01 00:00:00

Unités supportées

Voilà une liste de quelques unités de temps que tu peux utiliser avec DATE_TRUNC() :

Unité de temps Description
year Début de l'année (par exemple, 2023-01-01 00:00:00)
quarter Début du trimestre (par exemple, 2023-07-01 00:00:00)
month Début du mois (par exemple, 2023-10-01 00:00:00)
week Début de la semaine* (par exemple, 2023-09-25 00:00:00)
day Début du jour (par exemple, 2023-10-01 00:00:00)
hour Début de l'heure (par exemple, 2023-10-01 15:00:00)
minute Début de la minute (par exemple, 2023-10-01 15:30:00)
second Début de la seconde (par exemple, 2023-10-01 15:30:45)

Plus l'unité de temps est petite, plus le résultat du tronquage sera précis. Au fait, la semaine commence le dimanche :)

Exemples d'utilisation de DATE_TRUNC()

Tronquer au début du jour. Dans cet exemple, on prend un timestamp et on l'arrondit au début du jour :

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- Résultat : 2023-10-01 00:00:00

Tronquer au début du mois. Maintenant, on coupe la date au début du mois :

SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- Résultat : 2023-10-01 00:00:00

Tronquer au début de l'année. Essayons d'arrondir la date au début de l'année :

SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- Résultat : 2023-01-01 00:00:00

Utilisation avec l'heure actuelle (NOW()). Si tu veux toujours bosser avec la date et l'heure actuelles, tu peux combiner DATE_TRUNC() et NOW() :

SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- Le résultat dépendra de l'heure actuelle, par exemple : 2023-10-01 15:00:00

Grouper les commandes par mois. Passons à un exemple plus pratique. Disons qu'on a une table avec des commandes, où chaque enregistrement a une date de commande. On veut compter le nombre de commandes par mois :

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date TIMESTAMP NOT NULL
);

INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');

SELECT DATE_TRUNC('month', order_date) AS order_month,
       COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;

Résultat :

order_month total_orders
2023-08-01 00:00 2
2023-09-01 00:00 1
2023-10-01 00:00 2

Cas pratiques d'utilisation

Analyse des données temporelles par période : tu veux savoir combien d'utilisateurs se sont inscrits chaque année, mois ou jour ? Utilise DATE_TRUNC() pour grouper les données.

Création de rapports : bien arrondir le timestamp rend les rapports plus lisibles.

Comparer des dates et heures : si t'as des données temporelles super précises (genre avec des millisecondes), tronque-les au niveau voulu pour comparer correctement.

Erreurs classiques avec DATE_TRUNC()

Utilisation d'unités non supportées. Par exemple, l'unité millisecond n'est pas supportée, et si tu l'utilises, tu vas avoir une erreur.

Mauvais type de données. La fonction DATE_TRUNC() marche seulement avec des types temporels, comme TIMESTAMP. Si tu lui passes une chaîne de caractères, tu vas avoir une erreur.

Erreur d'arrondi. Rappelle-toi que DATE_TRUNC() coupe toujours le temps au début de l'unité de temps indiquée. Si tu veux arrondir le temps, il vaut mieux utiliser d'autres méthodes.

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