Formater une date, c’est la transformer en texte selon la mise en forme de ton choix, comme 03/15/2026 ou Thursday, January 15. Chaque base de données a sa propre fonction pour ça, et les exemples couvrent PostgreSQL, MySQL, SQLite et SQL Server.
Comment formater des dates en SQL
Passe à la fonction une date et une chaîne de format. Les codes de la chaîne de format représentent des parties de la date, et tout le reste est recopié tel quel. Dans SQLite, la fonction s’appelle strftime(), et ses codes commencent par % :
strftime(format, date)
SELECT strftime('%m/%d/%Y', '2026-03-15');
-- Output: 03/15/2026
SELECT strftime('%I:%M %p', '2026-03-15 14:30:00');
-- Output: 02:30 PM
Sur une colonne, la même date peut sortir dans autant de formats que nécessaire :
-- Input: orders
-- order_id | order_date
-- ---------+--------------------
-- 1 | 2026-01-15 09:42:00
-- 2 | 2026-03-02 16:05:00
SELECT
order_date,
strftime('%Y-%m-%d', order_date) AS iso_date,
strftime('%m/%d/%Y', order_date) AS us_date,
strftime('%d/%m/%Y', order_date) AS european_date
FROM orders;
-- Output:
-- order_date | iso_date | us_date | european_date
-- --------------------+------------+------------+--------------
-- 2026-01-15 09:42:00 | 2026-01-15 | 01/15/2026 | 15/01/2026
-- 2026-03-02 16:05:00 | 2026-03-02 | 03/02/2026 | 02/03/2026
Voici les codes que tu utiliseras le plus, avec le résultat de chacun pour 2026-03-15 14:30:45 :
| Code | Signification | Exemple |
|---|---|---|
%Y |
Année sur 4 chiffres | 2026 |
%m |
Mois (01-12) | 03 |
%d |
Jour du mois (01-31) | 15 |
%H |
Heure, format 24 h (00-23) | 14 |
%I |
Heure, format 12 h (01-12) | 02 |
%p |
AM ou PM | PM |
%M |
Minute (00-59) | 30 |
%S |
Seconde (00-59) | 45 |
%w |
Jour de la semaine (0-6, dimanche = 0) | 0 |
Règles à connaître
-
SQLite n’a pas de codes pour les noms de jours ou de mois. Des codes comme
%aet%Bfont renvoyer NULL àstrftime(). Convertis plutôt%wou%men nom avecCASE(voir la section sur le jour de la semaine plus bas). -
Le résultat est du texte. Comparer ou trier des dates formatées revient à comparer des chaînes, ce qui ne respecte l’ordre chronologique que si l’année vient en premier :
-- Input: sales
-- id | sale_date | amount
-- ---+------------+-------
-- 1 | 2025-11-20 | 89.0
-- 2 | 2026-01-08 | 120.0
-- 3 | 2026-03-04 | 64.5
-- Wrong: '11/2025' > '02/2026' is true, because '1' > '0'
SELECT * FROM sales
WHERE strftime('%m/%Y', sale_date) > '02/2026';
-- Output:
-- id | sale_date | amount
-- ---+------------+-------
-- 1 | 2025-11-20 | 89.0
-- 3 | 2026-03-04 | 64.5
-- Right: put the year first
SELECT * FROM sales
WHERE strftime('%Y-%m', sale_date) > '2026-02';
-- Output:
-- id | sale_date | amount
-- ---+------------+-------
-- 3 | 2026-03-04 | 64.5
-
NULL en entrée, NULL en sortie.
strftime('%Y-%m-%d', NULL)renvoie NULL. Entoure-le deCOALESCE()pour afficher autre chose, comme'No date'. -
Filtre sur la date, formate-la pour l’affichage.
WHERE order_date >= '2026-01-01' AND order_date < '2027-01-01'renvoie les mêmes lignes queWHERE strftime('%Y', order_date) = '2026', mais seule la première peut utiliser un index surorder_date.
Syntaxes alternatives
PostgreSQL, MySQL et SQL Server ont chacun leur propre fonction et leurs propres codes :
-- PostgreSQL: TO_CHAR(value, pattern)
-- (FM stops it padding the day name to 9 characters)
SELECT TO_CHAR(TIMESTAMP '2026-01-15 09:42:00', 'FMDay, MM/DD/YYYY HH24:MI');
-- Output: Thursday, 01/15/2026 09:42
-- MySQL: DATE_FORMAT(value, pattern)
-- (%i is the minute; %M would be the month name)
SELECT DATE_FORMAT('2026-01-15 09:42:00', '%W, %m/%d/%Y %H:%i');
-- Output: Thursday, 01/15/2026 09:42
-- SQL Server: FORMAT(value, pattern)
-- (MM is the month, mm the minute)
SELECT FORMAT(CAST('2026-01-15 09:42:00' AS datetime2), 'dddd, MM/dd/yyyy HH:mm');
-- Output: Thursday, 01/15/2026 09:42
-- Older SQL Server code uses CONVERT with a style number (101 is mm/dd/yyyy)
SELECT CONVERT(VARCHAR(10), CAST('2026-01-15' AS date), 101);
-- Output: 01/15/2026
Quand formater des dates ?
Formate une date quand elle doit être affichée ou regroupée sous forme de texte. La plupart des cas entrent dans l’une de ces quatre catégories.
Afficher les dates dans un format standard
Utilise l’ISO 8601 (YYYY-MM-DD) pour les fichiers et les API, MM/DD/YYYY pour les lecteurs américains et DD/MM/YYYY pour la majeure partie de l’Europe. Le formatage permet aussi de retirer l’heure quand tu ne veux que la date.
Regrouper les lignes par mois ou par année
Extrais uniquement la partie de la date qui t’intéresse, comme %Y pour l’année ou %Y-%m pour le mois, puis regroupe sur le résultat pour obtenir des totaux annuels ou mensuels.
Écrire des dates lisibles
Mélange codes et mots pour les libellés, les rappels et les e-mails. « 03/16 at 02:30 PM » se lit mieux que « 2026-03-16 14:30:00 ».
Travailler avec le jour de la semaine
%w donne le jour de la semaine sous forme de nombre, de 0 (dimanche) à 6 (samedi). Filtre dessus pour trouver les jours ouvrés ou les week-ends, ou convertis-le en nom avec CASE.
Exemples concrets de formatage de dates
Horodater un export au format ISO 8601
Une API attend des horodatages comme 2026-03-15T08:05:12Z. Les heures de audit_log sont stockées en UTC, il suffit donc de placer T et Z autour des codes (SQLite) :
-- Input: audit_log
-- id | action | logged_at
-- ---+--------+--------------------
-- 1 | login | 2026-03-15 08:05:12
-- 2 | export | 2026-03-15 14:30:45
-- 3 | logout | 2026-03-15 17:58:03
SELECT
id,
action,
strftime('%Y-%m-%dT%H:%M:%SZ', logged_at) AS logged_at_iso
FROM audit_log;
-- Output:
-- id | action | logged_at_iso
-- ---+--------+---------------------
-- 1 | login | 2026-03-15T08:05:12Z
-- 2 | export | 2026-03-15T14:30:45Z
-- 3 | logout | 2026-03-15T17:58:03Z
Compter les inscriptions par mois
Regroupe les utilisateurs selon leur mois d’inscription (PostgreSQL). YYYY-MM garde les mois dans l’ordre chronologique :
-- Input: users
-- id | name | signup_date
-- ---+------------+------------
-- 1 | Ana Lima | 2026-01-08
-- 2 | Ben Okafor | 2026-01-27
-- 3 | Chloe Park | 2026-02-14
-- 4 | Dev Mehta | 2026-03-03
-- 5 | Elle Novak | 2026-03-30
SELECT
TO_CHAR(signup_date, 'YYYY-MM') AS month,
COUNT(*) AS signups
FROM users
GROUP BY TO_CHAR(signup_date, 'YYYY-MM')
ORDER BY month;
-- Output:
-- month | signups
-- --------+--------
-- 2026-01 | 2
-- 2026-02 | 1
-- 2026-03 | 2
Rédiger une confirmation de réservation
Écris le jour et le mois en toutes lettres dans un message de confirmation (SQL Server) :
-- Input: bookings
-- guest_name | booking_time
-- ------------+--------------------
-- Priya Patel | 2026-03-16 14:30:00
-- Liam Murphy | 2026-03-18 09:15:00
SELECT
guest_name,
FORMAT(booking_time, 'dddd, MMMM d') + ' at ' + FORMAT(booking_time, 'h:mm tt') AS confirmation
FROM bookings;
-- Output:
-- guest_name | confirmation
-- ------------+-------------------------------
-- Priya Patel | Monday, March 16 at 2:30 PM
-- Liam Murphy | Wednesday, March 18 at 9:15 AM
Trouver le jour le plus chargé de la semaine
Compte les commandes selon le nom du jour où elles ont été passées (MySQL) :
-- Input: orders
-- order_id | order_date
-- ---------+--------------------
-- 1 | 2026-03-07 10:12:00
-- 2 | 2026-03-09 16:40:00
-- 3 | 2026-03-14 11:05:00
-- 4 | 2026-03-16 09:20:00
-- 5 | 2026-03-21 13:45:00
SELECT
DATE_FORMAT(order_date, '%W') AS weekday,
COUNT(*) AS order_count
FROM orders
GROUP BY weekday
ORDER BY order_count DESC;
-- Output:
-- weekday | order_count
-- ---------+------------
-- Saturday | 3
-- Monday | 2
Pour aller plus loin sur le formatage des dates
Sur ce blog :
-
Guide du formatage des dates dans PostgreSQL : plus de modèles
TO_CHAR - Guide de SQL DATEDIFF : l’écart entre deux dates
-
Guide d’insertion de dates en SQL : dans l’autre sens, du texte vers les dates avec
STR_TO_DATE()et compagnie - PostgreSQL : sélectionner uniquement les jours ouvrés : filtrer par jour de la semaine
- Guide de SQL GROUP BY : regrouper des lignes en totaux mensuels ou annuels
- Guide de l’instruction SQL CASE : convertir les numéros de jours en noms
Documentation officielle :
- PostgreSQL : fonctions de formatage des types de données
- MySQL: DATE_FORMAT()
- SQLite : fonctions de date et d’heure
- SQL Server : FORMAT et CAST et CONVERT
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de bases de données, mais Beekeeper trouve l’équilibre parfait entre fonctionnalités et simplicité. Ça marche, tout simplement. »