PostgreSQL propose plusieurs fonctions intégrées pour manipuler les valeurs temporelles actuelles. Ces fonctions sont super utiles pour des trucs comme suivre automatiquement la date de création d'une ligne, faire des rapports basés sur la date du jour ou vérifier si un événement est arrivé dans une période donnée. On va voir trois fonctions principales : NOW(), CURRENT_DATE et CURRENT_TIME.
NOW() : obtenir la date et l'heure actuelles
La fonction NOW() renvoie la date et l'heure actuelles au format TIMESTAMP WITH TIME ZONE. Ça veut dire que le résultat inclut l'heure précise avec le fuseau horaire du serveur.
Exemple :
SELECT NOW();
-- Résultat : 2025-05-25 14:30:45.761523+03
Fais gaffe, le résultat inclut :
- la date (
2025-05-25), - l'heure (
14:30:45.761523), - le fuseau horaire (
+03).
Si t'as pas besoin du fuseau horaire, tu peux convertir explicitement le résultat en TIMESTAMP :
SELECT NOW()::TIMESTAMP;
-- Résultat : 2025-05-25 14:30:45.761523
CURRENT_DATE : obtenir la date actuelle
La fonction CURRENT_DATE renvoie juste la date du jour, sans l'heure. Le type de retour, c'est DATE.
Exemple :
SELECT CURRENT_DATE;
-- Résultat : 2025-05-25
C'est pratique si t'as pas besoin de l'heure, genre pour calculer des âges ou grouper des données par jour.
CURRENT_TIME : obtenir l'heure actuelle
La fonction CURRENT_TIME renvoie l'heure actuelle au format TIME WITH TIME ZONE. Si t'as pas besoin du fuseau horaire, tu peux convertir le résultat en TIME.
Exemple :
SELECT CURRENT_TIME;
-- Résultat : 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Résultat : 14:30:45.761523
Exemples d'utilisation des fonctions
Regardons quelques exemples pratiques où ces fonctions peuvent servir.
Remplissage automatique de la date de création d'une ligne
Quand on ajoute des lignes dans une table, c'est souvent utile de sauvegarder automatiquement la date et l'heure de création. Dans PostgreSQL, tu peux faire ça en mettant DEFAULT NOW() lors de la création de la table.
Exemple de création de table :
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- moment de création de la ligne
);
Ajout d'une ligne :
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Regardons le contenu de la table :
SELECT * FROM orders;
Résultat :
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Filtrer les données par date
Imaginons qu'on a une table de commandes et qu'on veut sélectionner toutes les commandes créées aujourd'hui. On utilise la fonction CURRENT_DATE pour filtrer :
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Ici, on utilise la conversion created_at::DATE pour virer l'heure et garder juste la date.
Différences entre NOW() et CURRENT_TIMESTAMP
À première vue, on dirait que NOW() et CURRENT_TIMESTAMP font la même chose. En vrai, c'est le cas. C'est juste que NOW() vient d'un standard, et CURRENT_TIMESTAMP d'un autre.
NOW() — fonction PostgreSQL
La fonction NOW() est une fonction intégrée PostgreSQL qui renvoie une valeur de type TIMESTAMP WITH TIME ZONE (timestamptz). C'est l'heure du serveur au début de l'exécution de la requête SQL.
Exemple :
SELECT NOW();
CURRENT_TIMESTAMP — standard SQL
CURRENT_TIMESTAMP est une expression définie par le standard SQL, et elle renvoie aussi TIMESTAMP WITH TIME ZONE dans PostgreSQL. En gros, PostgreSQL implémente CURRENT_TIMESTAMP comme un appel à la même fonction que NOW().
Exemple :
SELECT CURRENT_TIMESTAMP;
Comparaison en pratique
SELECT NOW(), CURRENT_TIMESTAMP;
Résultat :
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Les deux valeurs sont identiques parce qu'elles sont calculées au même moment — au début de la requête.
Utiliser les fonctions temporelles dans les conditions de filtrage
Maintenant, essayons d'écrire une requête qui sélectionne les lignes créées dans les 7 derniers jours. Pour ça, tu peux utiliser NOW() avec des opérations arithmétiques sur les dates :
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Pareil, si tu veux sélectionner les commandes du mois en cours, tu peux utiliser la fonction DATE_TRUNC() pour tronquer au début du mois :
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() est une fonction sympa, je t'en parlerai plus en détail dans quelques cours :P
Astuces pratiques
- Utilise
NOW()ouCURRENT_TIMESTAMPsi tu veux l'heure précise avec le fuseau horaire. - Prends
CURRENT_DATEsi pour ton cas, la date suffit (genre pour calculer des âges ou analyser des événements d'un jour précis). CURRENT_TIMEsert surtout à afficher l'heure dans des rapports ou des interfaces où tu veux montrer combien de temps a été passé sur une tâche.
Dans le prochain cours, on va commencer à extraire des parties de dates et d'heures avec les fonctions EXTRACT() et AGE(). Avec ça, tu pourras par exemple calculer facilement l'âge d'une personne ou manipuler des données par jour, mois ou année.
GO TO FULL VERSION