Guide du temps actuel MySQL : NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, paramètres de fuseau horaire et meilleures pratiques

目次

1. Introduction

Quand avez-vous besoin de gérer l’heure actuelle dans MySQL ?

Dans MySQL, la récupération de l’heure actuelle est requise dans de nombreux scénarios différents. Par exemple, les cas d’utilisation suivants sont courants :

  • Insertion automatique d’un horodatage lors de l’enregistrement des données
  • Par exemple, enregistrement de la date et de l’heure de création lors de la sauvegarde de données de commandes ou de journaux.
  • Filtrage des données en fonction de l’heure actuelle
  • Par exemple, récupération uniquement des données des 7 derniers jours ou recherche de enregistrements avec des dates futures.
  • Formatage des dates et des heures pour l’affichage
  • Formatage des valeurs de date et d’heure pour une meilleure lisibilité lors de la génération de rapports.
  • Gestion de l’expiration des données en utilisant l’heure actuelle
  • Par exemple, détermination si un coupon est encore valide en le comparant à l’heure actuelle.

Comme vous pouvez le voir, récupérer et manipuler correctement l’heure actuelle dans MySQL est une compétence importante en gestion de base de données.

Ce que vous apprendrez dans cet article

Cet article explique les sujets suivants en détail :

  • Comment récupérer l’heure actuelle dans MySQL (NOW(), CURRENT_TIMESTAMP, etc.)
  • Comment changer les formats de date et d’heure (en utilisant DATE_FORMAT())
  • Calculs de date et d’heure en utilisant l’heure actuelle (en utilisant INTERVAL)
  • Comment changer le fuseau horaire (SET SESSION time_zone)
  • Utilisation de l’heure actuelle comme valeur par défaut (CURRENT_TIMESTAMP)
  • Erreurs courantes et comment les corriger (FAQ)

Des bases à l’utilisation avancée de la gestion de l’« heure actuelle » dans MySQL, ce guide fournit des exemples SQL pratiques. Assurez-vous de lire jusqu’à la fin.

2. Comment récupérer l’heure actuelle dans MySQL

Liste des fonctions pour récupérer l’heure actuelle dans MySQL

MySQL fournit plusieurs fonctions pour récupérer l’heure actuelle. Comprenez les différences et utilisez-les de manière appropriée.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

Fonction NOW()

NOW() est la fonction la plus couramment utilisée dans MySQL pour récupérer l’heure actuelle.
Elle retourne à la fois la date et l’heure.

SELECT NOW();

Exemple de sortie :

2025-02-11 16:00:00
  • NOW() retourne l’heure système actuelle.
  • Comme elle est affectée par le fuseau horaire, l’heure affichée peut différer en fonction de votre environnement (expliqué en détail dans la section « Paramètres de fuseau horaire »).

Comment utiliser CURRENT_TIMESTAMP

CURRENT_TIMESTAMP se comporte presque de la même manière que NOW(). Elle respecte la norme SQL et peut également être utilisée dans d’autres bases de données.

SELECT CURRENT_TIMESTAMP;

Exemple de sortie :

2025-02-11 16:00:00

Obtenir uniquement la date avec CURDATE()

CURDATE() est utilisée lorsque vous souhaitez récupérer uniquement la date actuelle (année, mois, jour).

SELECT CURDATE();

Exemple de sortie :

2025-02-11

Obtenir uniquement l’heure avec CURTIME()

Si vous souhaitez récupérer uniquement l’heure actuelle (heure, minute, seconde), utilisez CURTIME().

SELECT CURTIME();

Exemple de sortie :

16:00:00

Quelle fonction devez-vous utiliser ?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

3. Comment formater l’heure actuelle dans MySQL

Formatage personnalisé avec DATE_FORMAT()

Syntaxe de base de DATE_FORMAT()

Dans MySQL, vous pouvez utiliser la fonction DATE_FORMAT() pour changer librement le format des dates et des heures.

SELECT DATE_FORMAT(datetime_value, 'format_specifiers');

Exemple : Convertir NOW() au format YYYY/MM/DD HH:MM

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

Sortie :

2025/02/11 16:45

Liste des spécificateurs de format courants

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (00-59)30

Extraire uniquement la partie heure avec TIME()

Si vous souhaitez extraire uniquement la partie heure de la datetime retournée par NOW(), utilisez la fonction TIME().

SELECT TIME(NOW());

Sortie :

16:45:30

Extraire des parties avec YEAR(), MONTH() et DAY()

Pour extraire uniquement des parties spécifiques, utilisez les fonctions suivantes.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT DAY(NOW());11

Exemples pratiques de formatage

Le SQL suivant est utile pour essayer différents formats en pratique.

SELECT 
    NOW() AS 'Original datetime',
    DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
    DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
    TIME(NOW()) AS 'Time only',
    YEAR(NOW()) AS 'Year',
    MONTH(NOW()) AS 'Month',
    DAY(NOW()) AS 'Day';

4. Calculs de date/heure en utilisant l’heure actuelle dans MySQL

Ajouter/Soustraire avec INTERVAL

Syntaxe de base

SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;

Ajouter du temps basé sur NOW()

Par exemple, pour récupérer la date/heure « une semaine plus tard » :

SELECT NOW() + INTERVAL 7 DAY;

Exemple de sortie :

2025-02-18 16:30:00
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + INTERVAL 3 MONTH

Calculer la différence entre deux dates avec DATEDIFF()

SELECT DATEDIFF(NOW(), '2025-01-01');

Exemple de sortie :

30

Filtrer par une plage de dates avec BETWEEN

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

5. Paramètres de fuseau horaire MySQL

Vérifier le fuseau horaire actuel

SHOW VARIABLES LIKE '%time_zone%';

Exemple de sortie :

+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| system_time_zone | UTC            |
| time_zone        | SYSTEM         |
+------------------+----------------+

Modifier le fuseau horaire par session

SET SESSION time_zone = 'Asia/Tokyo';

Modifier le fuseau horaire par défaut du serveur

Ajoutez ce qui suit au fichier de configuration (my.cnf) :

[mysqld]
default_time_zone = 'Asia/Tokyo'

Obtenir l’heure UTC avec UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Convertir en heure locale avec CONVERT_TZ()

SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');

6. Comment définir l’heure actuelle comme valeur par défaut dans MySQL

Définir CURRENT_TIMESTAMP comme valeur par défaut

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

Mises à jour automatiques avec ON UPDATE CURRENT_TIMESTAMP

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
);

Différence entre DATETIME et TIMESTAMP

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

Pourquoi vous ne pouvez pas utiliser NOW() comme valeur par défaut et la solution

ERROR 1067 (42000): Invalid default value for 'created_at'

Solution :

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

7. Erreurs MySQL courantes et solutions (FAQ)

Impossible d’utiliser NOW() comme valeur par défaut

Exemple d’erreur

CREATE TABLE logs (
    created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'

Solution

CREATE TABLE logs (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

L’heure CURRENT_TIMESTAMP est incorrecte

SHOW VARIABLES LIKE 'time_zone';

Solution

SET SESSION time_zone = 'Asia/Tokyo';

Le résultat de NOW() est décalé d’une heure

SHOW VARIABLES LIKE 'system_time_zone';

Solution

SET GLOBAL time_zone = 'Asia/Tokyo';

Le filtrage de plage BETWEEN ne fonctionne pas comme prévu

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';

Solution

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

8. Bonnes pratiques pour gérer l’heure actuelle dans MySQL

Quand utiliser NOW() vs CURRENT_TIMESTAMP

Use CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Quand utiliser TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 bytes

Stocker en UTC et convertir en heure locale

SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');

Utilisez >= et < au lieu de BETWEEN

SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00' 
AND created_at < '2025-03-01 00:00:00';

Standardiser l’utilisation de INTERVAL

SELECT NOW() + INTERVAL 1 DAY;

Nettoyer correctement les anciennes données

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;