Heure actuelle MySQL : NOW(), CURDATE(), UTC_TIMESTAMP(), fuseaux horaires et bonnes pratiques

目次

1. Obtenir l’heure actuelle dans MySQL (En bref : la feuille de triche SQL la plus courte)

Si vous souhaitez obtenir l’heure actuelle dans MySQL, il n’y a que quelques fonctions SQL à retenir.
Voici la réponse la plus courte pour le mot‑clé de recherche « MySQL get current time ».

1.1 Date et heure actuelles MySQL : NOW() / CURRENT_TIMESTAMP

Renvoie la date + heure actuelle (YYYY-MM-DD HH:MM:SS).

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Exemple de sortie

2025-02-01 15:30:45
  • NOW() et CURRENT_TIMESTAMP renvoient généralement le même résultat.
  • Les deux renvoient la date et l’heure actuelles.
  • Si vous avez besoin de millisecondes, utilisez ce qui suit.
    SELECT NOW(3);
    

Notes (erreurs courantes)

  • Dépend du paramètre de fuseau horaire du serveur.
  • Dans un environnement UTC, vous pouvez obtenir l’UTC au lieu de l’heure du Japon.
  • Pendant l’exécution de la requête, il renvoie essentiellement la même heure (fixée pendant une seule instruction).

1.2 Date actuelle MySQL : CURDATE()

Renvoie uniquement la date (pas d’heure).

SELECT CURDATE();

Exemple de sortie

2025-02-01

Cas d’utilisation

  • Interroger les données d’aujourd’hui
  • Comparaisons de dates (par ex., filtrer uniquement les enregistrements d’aujourd’hui)

Notes

  • La valeur renvoyée est de type DATE.
  • Inadapté lorsqu’un traitement de l’heure du jour est nécessaire.

1.3 Heure actuelle MySQL : CURTIME()

Renvoie uniquement l’heure.

SELECT CURTIME();

Exemple de sortie

15:30:45

Cas d’utilisation

  • Vérifications des heures d’ouverture
  • Logique conditionnelle selon une fenêtre horaire

Notes

  • N’inclut pas d’information de date.
  • Ne peut pas être utilisé pour comparer avec des colonnes de type DATE.

1.4 Heure UTC actuelle MySQL : UTC_TIMESTAMP()

Renvoie l’heure en UTC (Temps Universel Coordonné), quel que soit le paramètre de fuseau horaire du serveur.

SELECT UTC_TIMESTAMP();

Exemple de sortie

2025-02-01 06:30:45

Quand l’utiliser

  • Services globaux
  • Conceptions qui stockent les journaux en UTC de manière cohérente

Erreurs courantes

  • Le mélanger avec NOW() entraîne des décalages horaires
  • Si l’application suppose le JST, vous verrez une différence de 9 heures

1.5 Heure actuelle MySQL avec millisecondes : NOW(3) / CURRENT_TIMESTAMP(3)

MySQL 5.6 et versions ultérieures prennent en charge les secondes fractionnaires.

SELECT NOW(3);
SELECT CURRENT_TIMESTAMP(3);

Exemple de sortie

2025-02-01 15:30:45.123

Notes pour le stockage

Votre colonne doit également prendre en charge les secondes fractionnaires.

DATETIME(3)
TIMESTAMP(3)

Si vous l’enregistrez dans une colonne qui ne le supporte pas, la partie fractionnaire sera tronquée.

1.6 Feuille de triche rapide par objectif

PurposeSQL
Current date and timeSELECT NOW();
Get UTCSELECT UTC_TIMESTAMP();
Date onlySELECT CURDATE();
Time onlySELECT CURTIME();
Get millisecondsSELECT NOW(3);

Résumé des pièges courants

  • L’heure est décalée parce que vous n’avez pas vérifié le fuseau horaire
  • Utiliser NOW(3) sans une colonne capable de gérer les millisecondes
  • Mélanger UTC et heure locale
  • Ne pas comprendre la différence entre DATETIME et TIMESTAMP

MySQL DATETIME と TIMESTAMP の違いを示した図。TIMESTAMPはUTC変換され、DATETIMEは変換されない。

Différence entre MySQL DATETIME et TIMESTAMP (comparaison de la conversion de fuseau horaire)

2. Différences entre MySQL NOW() et CURRENT_TIMESTAMP

NOW() et CURRENT_TIMESTAMP semblent similaires, mais ne pas comprendre où les utiliser et comment ils se comportent peut facilement provoquer des bugs. Ici nous résumons les différences, l’utilisation correcte et les pièges courants.

2.1 Lequel devriez‑vous utiliser ? (utilisation dans SELECT / utilisation dans DEFAULT)

■ Lors de la récupération de la date/heure actuelle dans SELECT

SELECT NOW();
SELECT CURRENT_TIMESTAMP;

Normalement, les deux renvoient le même résultat.

  • Ils sont équivalents (synonymes)
  • La valeur renvoyée est équivalente à DATETIME
  • Affecté par le paramètre de fuseau horaire

En pratique

  • Privilégier la lisibilité → NOW()
  • Privilégier le style SQL standard → CURRENT_TIMESTAMP

■ Lors de la définition d’une valeur par défaut de colonne

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Le point clé ici est :

Pour une valeur par défaut, il est courant d’utiliser CURRENT_TIMESTAMP.

Certains environnements autorisent également NOW(), mais le comportement peut différer selon la version de MySQL et le mode SQL. Le choix le plus sûr est CURRENT_TIMESTAMP.

2.2 Correct usage of DEFAULT / ON UPDATE

Si vous souhaitez mettre à jour automatiquement un horodatage « updated at » :

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ON UPDATE CURRENT_TIMESTAMP
);

Comportement

  • Lors d’un INSERT → définit l’heure actuelle pour created_at / updated_at
  • Lors d’un UPDATE → ne met à jour que updated_at

Erreurs courantes

  • Ne pas correspondre à la précision des fractions de seconde lors de l’utilisation de DATETIME
  • Être limité par les anciennes restrictions de MySQL avec plusieurs colonnes TIMESTAMP (MySQL 5.6 et antérieur avaient des restrictions)

2.3 Différences entre NOW() et SYSDATE() (Important)

Le point facile à manquer est la différence avec SYSDATE().

SELECT NOW(), SYSDATE();

■ Différences de comportement

  • NOW() → fixé au moment du démarrage de la requête
  • SYSDATE() → renvoie l’heure au moment où il est appelé

Exemple :

SELECT NOW(), SLEEP(3), NOW();

NOW() renvoie la même valeur.

SELECT SYSDATE(), SLEEP(3), SYSDATE();

SYSDATE() montre une différence de 3 secondes.

2.4 Lequel devriez‑vous utiliser ?

FunctionBehaviorRecommended use
NOW()Fixed within a queryLogging, consistency-focused
SYSDATE()Call-time valuePrecise real-time retrieval

Pourquoi NOW() est souvent recommandé dans les systèmes réels

  • Maintient la cohérence à l’intérieur d’une transaction (un mécanisme qui exécute plusieurs instructions SQL ensemble)
  • Plus sûr dans les environnements de réplication

2.5 Idées fausses courantes et problèmes

❌ « NOW() et CURRENT_TIMESTAMP sont exactement les mêmes, donc vous n’avez pas besoin d’y penser. »

→ Les différences peuvent apparaître dans les valeurs par défaut ou le comportement de mise à jour, selon l’environnement.

❌ « SYSDATE() est plus précis, donc c’est toujours mieux. »

→ Cela peut poser des problèmes dans les environnements de réplication.

❌ Ne pas vérifier le fuseau horaire

SHOW VARIABLES LIKE '%time_zone%';

Si vous l’utilisez sans vérifier, vous pouvez obtenir des décalages horaires.

2.6 Bonnes pratiques

  • Récupération avec SELECT → NOW()
  • Valeur par défaut de colonne → CURRENT_TIMESTAMP
  • Mise à jour automatique → ON UPDATE CURRENT_TIMESTAMP
  • Axé sur la cohérence → défaut à NOW()
  • Conception basée sur UTC → TIMESTAMP + stockage en UTC
  1. MySQL Current Time Formatting (DATE_FORMAT / TIME_FORMAT)
    Après avoir récupéré l’heure actuelle dans MySQL, il est très courant de modifier le format d’affichage.
    Pour l’intention de recherche « MySQL current time format », la fonction la plus importante à comprendre est DATE_FORMAT().

3.1 MySQL datetime formatting: DATE_FORMAT(NOW(), …)
Syntaxe de base :

sql
SELECT DATE_FORMAT(target_datetime, 'format_string');

Exemple : formater l’heure actuelle

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

Exemple de sortie

2025-02-01 15:30:45
SpécificateurSignificationExemple
%YAnnée (4 chiffres)2025
%mMois (2 chiffres)02
%dJour (2 chiffres)01
%HHeure (24 h)15
%hHeure (12 h)03
%iMinute30
%sSeconde45
%pAM/PMPM

3.2 Converting to Japanese-style or 12-hour format
■ Format de style japonais

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');

Exemple de sortie :

2025-02-01 15:30

■ Format 12 h + AM/PM

sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s %p');

Exemple de sortie :

2025-02-01 03:30:45 PM

3.3 MySQL time-only formatting: TIME_FORMAT()
Une fonction de formatage spécifiquement pour les données de type TIME.

sql
SELECT TIME_FORMAT(CURTIME(), '%H:%i');

Exemple de sortie :

15:30

Remarques
TIME_FORMAT() ne s’applique qu’au type TIME
Pour DATETIME, utilisez DATE_FORMAT()

3.4 String → datetime conversion: STR_TO_DATE()
Pour convertir des données de chaîne en type datetime :

sql
SELECT STR_TO_DATE('2025-02-01 15:30:45', '%Y-%m-%d %H:%i:%s');

Exemple de sortie :

2025-02-01 15:30:45

Erreurs courantes
Incompatibilité de format renvoie NULL
Confondre %m et %c (mois avec zéro devant vs sans zéro)

3.5 Important points in production
❌ Ne comparez pas après formatage
Mauvais exemple :

sql
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-01';

Ceci est non recommandé car les index deviennent inefficaces (dégradation des performances de la requête).
Recommandé :

sql
WHERE created_at >= '2025-02-01' AND created_at < '2025-02-02';

❌ Ne surchargez pas le formatage côté base de données
Dans les applications web, le formatage pour l’affichage est généralement plus flexible côté application.
La base de données doit se concentrer sur le « stockage et le calcul ».

3.6 Formatting with milliseconds

sql
SELECT DATE_FORMAT(NOW(3), '%Y-%m-%d %H:%i:%s.%f');

%f représente les microsecondes (6 chiffres).

Remarque
Si la colonne n’est pas DATETIME(3) ou similaire, la partie fractionnaire sera tronquée.
Disponible dans MySQL 5.6 et versions ultérieures.

3.7 Summary by formatting purpose

ObjectifFonction
Modifier le format d’affichageDATE_FORMAT
Formatage de l’heure uniquementTIME_FORMAT
Conversion chaîne → datetimeSTR_TO_DATE
Afficher les millisecondes%f
  1. MySQL Date and Time Addition/Subtraction (DATE_ADD / DATE_SUB)
    Même si vous pouvez récupérer l’heure actuelle, vous ne pouvez pas l’utiliser efficacement en production sans calculs de date/heure tels que « X jours plus tard » ou « X heures auparavant ».
    Nous expliquons ici comment utiliser DATE_ADD() et DATE_SUB() avec l’heure actuelle dans MySQL.

4.1 MySQL datetime addition: DATE_ADD()
Syntaxe de base :

sql
SELECT DATE_ADD(base_datetime, INTERVAL value unit);

Exemple : 7 jours à partir de maintenant

sql
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

Exemple : 2 heures plus tard

sql
SELECT DATE_ADD(NOW(), INTERVAL 2 HOUR);
UnitéSignification
SECONDSecondes
MINUTEMinutes
HOURHeures
DAYJours
MONTHMois
YEARAnnées

4.2 MySQL datetime subtraction: DATE_SUB()
Syntaxe de base :

sql
SELECT DATE_SUB(base_datetime, INTERVAL value unit);

Exemple : il y a 30 jours

sql
SELECT DATE_SUB(NOW(), INTERVAL 30 DAY);

Exemple : il y a 1 heure

sql
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR);

Cas d’utilisation
Vérifications d’expiration
Suppression d’anciens journaux
Extraction de données récentes

4.3 Common production patterns
■ Récupérer les données des dernières 24 heures

sql
SELECT * FROM logs WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

■ Définir une échéance 7 jours plus tard

sql
INSERT INTO tasks (deadline) VALUES (DATE_ADD(NOW(), INTERVAL 7 DAY));

4.4 Erreurs courantes et précautions
❌ Appliquer des fonctions aux colonnes
Mauvais exemple :
WHERE DATE(created_at) = CURDATE();
Cela désactive les index (optimisation des performances des requêtes).
Recommandé :
WHERE created_at >= CURDATE() AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);
❌ Ignorer les fuseaux horaires
NOW() se base sur le fuseau horaire du serveur
Si vous stockez en UTC, utilisez UTC_TIMESTAMP() comme base
Exemple :
SELECT DATE_ADD(UTC_TIMESTAMP(), INTERVAL 1 DAY);
❌ Pièges de l’ajout de mois
SELECT DATE_ADD('2025-01-31', INTERVAL 1 MONTH);
→ En raison de l’ajustement de fin de mois, la date peut changer.
(Le résultat peut devenir 2025‑02‑28 selon l’environnement.)
Comprenez la spécification avant d’utiliser des calculs basés sur les mois.

4.5 Ajout avec millisecondes
SELECT DATE_ADD(NOW(3), INTERVAL 500 MILLISECOND);
※ MySQL ne supporte pas directement MILLISECOND.
Spécifiez en microsecondes :
SELECT DATE_ADD(NOW(3), INTERVAL 500000 MICROSECOND);

4.6 Bonnes pratiques
Standardisez sur NOW() ou UTC_TIMESTAMP() comme base
Ne pas appliquer de fonctions aux colonnes dans la clause WHERE
Comprendre le comportement de l’ajout basé sur les mois
Si une précision est requise, utilisez DATETIME(3) ou supérieur

5. Calculer les différences de date/heure dans MySQL (DATEDIFF / TIMESTAMPDIFF)

Dans les systèmes de production, récupérer simplement l’heure actuelle n’est pas suffisant. Vous avez souvent besoin de calculer combien de jours se sont écoulés ou combien d’heures restent.

5.1 Calcul des différences de dates : DATEDIFF()

DATEDIFF() calcule la différence en jours entre deux dates.

SELECT DATEDIFF('2025-02-10', '2025-02-01');

Résultat

9

Points clés

  • Retourne la différence en jours uniquement
  • La partie temps est ignorée
  • Le résultat peut être négatif

Exemple : calculer les jours depuis la création

SELECT DATEDIFF(NOW(), created_at)
FROM users;

5.2 Calcul des différences par unité : TIMESTAMPDIFF()

TIMESTAMPDIFF() vous permet de spécifier l’unité.

SELECT TIMESTAMPDIFF(unit, start_datetime, end_datetime);

Exemple : différence en heures

SELECT TIMESTAMPDIFF(HOUR, '2025-02-01 10:00:00', '2025-02-01 15:00:00');

Résultat

5

Unités courantes

UnitMeaning
SECONDSeconds
MINUTEMinutes
HOURHours
DAYDays
MONTHMonths
YEARYears

Exemple : calculer les minutes depuis la connexion

SELECT TIMESTAMPDIFF(MINUTE, login_at, NOW())
FROM users;

5.3 Cas d’utilisation en production

  • Vérifications de timeout de session
  • Vérifications d’expiration d’abonnement
  • Calcul du temps écoulé dans les journaux
  • Logique de limitation de débit

5.4 Erreurs courantes

❌ Utiliser DATEDIFF quand la précision temporelle est requise

DATEDIFF() ignore les heures et les minutes.

❌ Inverser l’ordre des arguments

L’ordre est :

TIMESTAMPDIFF(unit, start, end)

Si inversé, le résultat devient négatif.

❌ Ignorer les fuseaux horaires

En mélangeant UTC et heure locale, les différences peuvent être incorrectes.

5.5 Bonnes pratiques

  • Utilisez TIMESTAMPDIFF() lorsque la précision temporelle compte
  • Utilisez DATEDIFF() pour les calculs simples en jours
  • Assurez une utilisation cohérente des fuseaux horaires
  • Standardisez sur UTC dans les systèmes distribués

6. Requêtes de plage de dates en utilisant l’heure actuelle

L’une des exigences réelles les plus courantes est de récupérer les enregistrements dans une plage de temps spécifique, comme :

  • Les enregistrements d’aujourd’hui
  • Les 7 derniers jours
  • Les dernières 24 heures
  • Ce mois‑ci

6.1 Récupérer les enregistrements d’aujourd’hui (compatible avec les index)

SELECT *
FROM logs
WHERE created_at >= CURDATE()
  AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

Pourquoi c’est correct

  • Aucune fonction n’est appliquée à la colonne
  • Les index restent utilisables
  • Requête de plage efficace

6.2 Les 7 derniers jours

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

6.3 Les dernières 24 heures

SELECT *
FROM logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

6.4 Ce mois‑ci

SELECT *
FROM logs
WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')
  AND created_at < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);

Dans les systèmes de production, il est souvent préférable de calculer les limites côté application et de les transmettre en tant que paramètres.

6.5 Erreurs de performance courantes

❌ Appliquer des fonctions aux colonnes indexées

WHERE DATE(created_at) = CURDATE();

Cela empêche l’utilisation des index et entraîne des scans complets de la table.

❌ Utiliser BETWEEN imprudemment

BETWEEN est inclusif et peut provoquer des problèmes d’écart d’une seconde.

6.6 Résumé des meilleures pratiques

  • Utilisez toujours des conditions de plage pour le filtrage des dates
  • Évitez d’appliquer des fonctions aux colonnes indexées
  • Privilégiez le stockage en UTC dans les systèmes globaux
  • Soyez explicite concernant les hypothèses de fuseau horaire