CodeGym /Cours /SQL SELF /Fonctions pour obtenir la date et l'heure actuelles :

Fonctions pour obtenir la date et l'heure actuelles : NOW(), CURRENT_DATE, CURRENT_TIME

SQL SELF
Niveau 31 , Leçon 1
Disponible

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() ou CURRENT_TIMESTAMP si tu veux l'heure précise avec le fuseau horaire.
  • Prends CURRENT_DATE si pour ton cas, la date suffit (genre pour calculer des âges ou analyser des événements d'un jour précis).
  • CURRENT_TIME sert 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.

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