Français


Français


Base de connaissances

Gestion des données de type "DATE" avec MySQL et MariaDB


KB-LJW-DB-104



  




Articles et ressources connexes




Les dates et MySQL : un mariage raté




Le moment de l'explosion


Remerciez MySQL




Conseils et bonnes pratiques


Conseils lors de la conception du schema


Stocker les dates dans DATETIME


Ne pas stocker de date dans VARCHAR

SQL
-- Lire depuis le champ "d_date_txt" de type VARCHAR.
-- Tenter de convertir la chaine en date selon le pattern indiqué :
----- Échouera à la première donnée qui ne respecte pas le pattern !
SELECT
   STR_TO_DATE(d_date_txt, '%Y-%m-%d %H:%i:%s') AS d_date_safe
FROM myTable;


Définir une valeur par défaut


NULL
SQL
-- Création de table
-- Utiliser une valeur NULL par défaut => Valide sous MySQL et MariaDB
CREATE TABLE contactRequests (
  d_dateReceived DATETIME NULL DEFAULT NULL
);


CURRENT_TIMESTAMP
SQL
-- Création de table
CREATE TABLE contactRequests (
   d_dateReceived DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- Altération d'une table existante
ALTER TABLE contactRequests MODIFY d_dateReceived DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;


SQL
-- Ne pas spécifier le champ "d_dateReceived" :
-- il est automatiquement rempli avec la date courante.
INSERT INTO contactRequests (s_firstname, s_lastname)
VALUES ('John', 'Duff');

-- Fournir explicitement CURRENT_TIMESTAMP
-- (redondant et inutile, mais fonctionnel)
INSERT INTO contactRequests (s_firstname, s_lastname, d_dateReceived)
VALUES ('John', 'Duff', CURRENT_TIMESTAMP);

-- Fournir explicitement NULL
-- => PROVOQUE UNE ERREUR !
INSERT INTO contactRequests (s_firstname, s_lastname, d_dateReceived)
VALUES ('John', 'Duff', NULL);


0000-00-00 00:00:00
SQL
-- Création de table
-- Utiliser une Date invalide par défaut => historiquement tolérée par MySQL
CREATE TABLE contactRequests (
   d_dateReceived DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
);



Rendre la date obligatoire

SQL
-- Créer la table
---- d_dateReceived est obligatoire
---- NULL est interdit
---- aucune valeur par défaut n'est fournie
---- toute requête INSERT/UPDATE doit explicitement fournir d_dateReceived, sinon elle échoue
CREATE TABLE contactRequests (
  d_dateReceived DATETIME NOT NULL
);

-- Modifier la table existante
-- Échouera si une seule ligne contient encore NULL dans d_dateReceived => Nettoyer la table avant.
---- d_dateReceived est obligatoire
---- NULL est interdit
---- aucune valeur par défaut n'est fournie
---- toute requête INSERT/UPDATE doit explicitement fournir d_dateReceived, sinon elle échoue
ALTER TABLE contactRequests
MODIFY d_dateReceived DATETIME NOT NULL;



SQL
-- Exemple avec aucune valeur fournie :
-- La requête provoque un échec.
INSERT INTO contactRequests (s_firstname, s_lastname)

-- Exemple avec une valeur valide :
-- La requête est acceptée.
INSERT INTO contactRequests (s_firstname, s_lastname, d_dateReceived)
VALUES ('John', 'Duff', '2026-09-01 14:35:12');

-- Exemple de requête avec CURRENT_TIMESTAMP :
-- CURRENT_TIMESTAMP est utilisé ici comme valeur explicite, et non par défaut.
-- La requête est acceptée.
INSERT INTO contactRequests (s_firstname, s_lastname, d_dateReceived)
VALUES ('John', 'Duff', CURRENT_TIMESTAMP);


SQL
-- Créer la table
---- d_dateReceived est obligatoire
---- NULL est interdit
---- aucune valeur par défaut n'est fournie
---- toute requête INSERT/UPDATE doit explicitement fournir d_dateReceived, sinon elle échoue
---- Contrainte supplémentaire : Interdit les dates antérieures à 2012
CREATE TABLE contactRequests (
   d_dateReceived DATETIME NOT NULL,
   CONSTRAINT chk_dateReceived
      CHECK (d_dateReceived >= '2012-01-01')
);

-- Modifier la table existante
-- Échouera si une seule ligne contient encore NULL dans d_dateReceived => Nettoyer la table avant.
---- d_dateReceived est obligatoire
---- NULL est interdit
---- aucune valeur par défaut n'est fournie
---- toute requête INSERT/UPDATE doit explicitement fournir d_dateReceived, sinon elle échoue
---- Contrainte supplémentaire : Interdit les dates antérieures à 2012
ALTER TABLE contactRequests
ADD CONSTRAINT chk_dateReceived
CHECK (d_dateReceived >= '2012-01-01');



Conseils lors de l'importation de données


Importer grâce au sql_mode



 Cliquez pour classer par colonne
NiveauMéthode de définitionEmplacementPortée réelleImpactPersistanceRecommandations
1. Bas niveau[mysqld]my.iniGlobale serveurToutes les connexions
(après démarrage)
Oui
(au redémarrage)
À privilégier en production pour imposer des règles cohérentes et éviter les connexions permissives.
2. AdminSET GLOBAL sql_mode = ...SQL exécuté avec privilèges admin
(cmd > mysql)
Globale serveur
(uniquement pour les nouvelles connexions)
Nouvelles sessions uniquementNon
(perdu au redémarrage)
Utile pour un changement immédiat sans éditer la configuration [mysqld].
3. SessionSET SESSION sql_mode = ...SQL exécuté par application/outil
(phpMyAdmin, HeidiSQL, etc.)
Session courante
(une connexion)
Une seule connexionN/A
(vit durant la connexion)
Adapté aux usages ponctuels, imports, scripts.
4. Applicatif (haut niveau)INITSTMT=SET SESSION sql_mode=...Chaîne DSN / connexion ODBCSession courante
(à chaque ouverture de connexion via ce DSN)
Connexions qui utilisent ce DSNN/A
(ré-appliqué à chaque nouvelle connexion via ce DSN)
Utile pour pour standardiser le client ODBC.


Nettoyer après import


Rechercher les dates invalides (dates à Zéro)
SQL
-- Le champ d_dateReceived est de type Date
-- Le seuil 1000-01-01 couvre les dates techniquement stockables,
-- mais invalides au sens du standard SQL.
SELECT *
FROM contactRequests
WHERE d_dateReceived = '0000-00-00 00:00:00'
   OR d_dateReceived < '1000-01-01';

  • soit supprimer les lignes concernées
  • soit les remplacer par une vraie date métier (ex. date de création, date de commande, etc.)
  • soit les remplacer par NULL


Remplacer les dates incorrectes par NULL (dates à Zéro)
SQL
UPDATE contactRequests
SET d_dateReceived = NULL
WHERE d_dateReceived = '0000-00-00 00:00:00'
   OR d_dateReceived < '1000-01-01';


Modifier le schema (dates à Zéro)



Conseils lors de l'écriture de données


Ne pas fournir de valeur vide

ASP CLASSIC
<%
'Spécifier NULL via une requête SQL classique
'-	-	-	-	-	-	-	-	-	-	-	-
strSQL = "INSERT INTO contactRequests (d_dateReceived) VALUES (NULL)"
dbConn.Execute(strSQL)


'Spécifier NULL via une requête SQL paramétrée
'-	-	-	-	-	-	-	-	-	-	-	-
'N'utilisez pas vbNull : c'est une constante de type (masque interne VBScript)
Set paramCmd = Server.CreateObject("ADODB.Command")
Set paramCmd.ActiveConnection = dbConn
paramCmd.CommandText = "INSERT INTO contactRequests (d_dateReceived) VALUES (?)"
paramCmd.Parameters.Append paramCmd.CreateParameter("@d_dateReceived", adDBTimeStamp, adParamInput, , Null)
paramCmd.Execute
%>


Fournir une date au format ISO

ASP CLASSIC
<%
'Renvoyer une date formatée pour MySQL/MariaDB au format "YYYY-MM-DD HH:MM:SS"
Function DateFormat_MySQL_MariaDB(byVal dtInput)

   'Paramètre  Variable   Type          Description
   '---------  --------   ----          -----------
   '@param     dtInput    String/Date   Date ou Date/Heure (type VBScript/ASP "String" ou "Date")
   '@return    dtOutput   String/Null   Chaine de date formatée "YYYY-MM-DD HH:MM:SS", ou bien Null.

   Dim sYear, sMonth, sDay, sHour, sMinute, sSecond
   Dim dtOutput : dtOutput = Null
   
   'Si l'entrée est convertible en type "Date"
   If (IsDate(dtInput)) Then
      'Récupérer les parties de la date
      sYear   = CStr(Year(dtInput))
      sMonth  = Right("0" & Month(dtInput), 2)
      sDay    = Right("0" & Day(dtInput), 2)
      
      'Vérifier si une heure est présente
      If ((Hour(dtInput) + Minute(dtInput) + Second(dtInput)) > 0) Then
         sHour   = Right("0" & Hour(dtInput), 2)
         sMinute = Right("0" & Minute(dtInput), 2)
         sSecond = Right("0" & Second(dtInput), 2)
      Else
         sHour   = "00"
         sMinute = "00"
         sSecond = "00"
      End If
      
      'Construire la chaine de date au format ISO pour MySQL/MariaDB
      dtOutput = sYear & "-" & sMonth & "-" & sDay & " " & sHour & ":" & sMinute & ":" & sSecond
   Else
      dtOutput = Null 'Renvoyer Null si l'entrée n'est pas une date valide
   End If

   'Return
   DateFormat_MySQL_MariaDB = dtOutput

End Function 'DateFormat_MySQL_MariaDB



'= =  =  =  =  =  =
'Exemples d'utilisation
'= =  =  =  =  =  =

Dim dateSource, datetimeSource, dateStringForSQL

'Ex. Gestion d'une date en Anglais
'---------------------------------
SetLocale(1033) 'Régler LCID en Anglais

'Définir/lire une date source (au format Anglais) - de type vbString.
dateSource = "04/13/2026" 'ex. 13 Avril

'Renvoyer la date formatée pour MySQL/MariaDB
'=> RENVOIE : 2026-04-13 00:00:00
dateStringForSQL = DateFormat_MySQL_MariaDB(dateSource)


'Ex. Gestion d'une date en Français
'----------------------------------
SetLocale(1036) 'Régler LCID en Français

'Définir/lire une datetime source (au format Français) - de type vbDate.
datetimeSource = #01/09/2026 14:35:12# 'ex. 1 septembre

'Renvoyer la date formatée pour MySQL/MariaDB
'=> RENVOIE : 2026-09-01 14:35:12
dateStringForSQL = DateFormat_MySQL_MariaDB(datetimeSource)


'Définir la requête d'insertion dans la base de données
'Utiliser la date déjà correctement formatée pour MySQL/MariaDB
strSQL = _
   "INSERT INTO contactRequests ( " & _
      "s_firstname, " & _
      "s_lastname, " & _
      "d_dateReceived " & _
   ") VALUES ( " & _
      "'John', " & _
      "'Duff', " & _
      "STR_TO_DATE('" & dateStringForSQL & "') " & _
   ") "

'Ajouter dans la base de données
dbConn.Execute(strSQL)
%>


Fournir une date au format personnalisé

ASP CLASSIC
<%
'Définir un datetime avec un format Arbitraire/Exotique - de type vbString.
Dim datetimeSource : datetimeSource = "Annee=2026 Mois=09 Heure=14 Seconde=12 Jour=01 Minute=35"

'Définir un masque/pattern permattant à MySQL/MariaDB de comprendre la chaine fournie
'(contient les marqueurs %Y %m %d %H %i %s, qui sont reconnus MySQL/MariaDB)
Dim datetimeMask : datetimeMask = "Annee=%Y Mois=%m Heure=%H Seconde=%s Jour=%d Minute=%i"

'Définir la requête d'insertion dans la base de données
strSQL = _
   "INSERT INTO contactRequests (" & _
      "s_firstname, " & _
      "s_lastname, " & _
      "d_dateReceived " & _
   ") VALUES (" & _
      "'John', " & _
      "'Duff', " & _
      "STR_TO_DATE('" & datetimeSource & "', '" & datetimeMask & "') " & _
   ")"

'Ajouter dans la base de données
dbConn.Execute(strSQL)
%>




Laisser le moteur SQL utiliser la date courante




Conseils lors de la lecture de données


Utiliser des requêtes paramétrées


Gérer les valeurs sales

SQL
-- VARIANTE 1 : Plus concise
-- Les performances sont équivalentes entre CASE et NULLIF y compris sur de grands volumes.
-- CAST() n'a aucun impact en termes de performances.
-- *  *  *  *  *
-- Lire depuis le champ "d_date" de type DATETIME
-- S'assurer qu'une donnée est bien une date valide
-- Renvoie NULL sinon
SELECT
   CAST(
      NULLIF(
         IF(d_date < '1000-01-01', NULL, d_date),
         '0000-00-00 00:00:00'
      )
   AS DATETIME) AS d_date_safe
FROM contactRequests

-- VARIANTE 2 : Plus lisible
-- Les performances sont équivalentes entre CASE et NULLIF y compris sur de grands volumes.
-- CAST() n'a aucun impact en termes de performances.
-- *  *  *  *  *
-- Lire depuis le champ "d_date" de type DATETIME
-- S'assurer qu'une donnée est bien une date valide
-- Renvoie NULL sinon
SELECT
   CAST(
      CASE
         WHEN d_date = '0000-00-00 00:00:00' THEN NULL
         WHEN d_date < '1000-01-01'          THEN NULL
         ELSE d_date
      END
   AS DATETIME) AS d_date_safe
FROM contactRequests


SQL
-- Lire depuis le champ "d_date_txt" de type VARCHAR
-- Tenter de convertir la chaine en date selon le pattern indiqué
----- Échouera à la première donnée qui ne respecte pas le pattern !
SELECT
   STR_TO_DATE(d_date_txt, '%Y-%m-%d %H:%i:%s') AS d_date_safe
FROM myTable;


SQL
SELECT d_date FROM myTable WHERE d_date IS NOT NULL



Lire une date au format personnalisé

ASP CLASSIC
<%
'On souhaite récupérer la date au format Exotique suivant : YYYY/MM hh:ss
'   L'usage de cette fonction DATE_FORMAT() ralentit votre requête.
'   De ce fait il sera plus efficace de lire la donnée brute depuis MySQL/MariaDB,
'   puis d'utiliser ASP/VBScript pour en extraire les parties et la formater.
Dim dateMask : dateMask = "%Y/%m %H:%i"

'Définir la requête de lecture
Dim strSQL : strSQL = "SELECT DATE_FORMAT(contactRequests.d_dateReceived, '" & dateMask & "') AS myDate FROM contactRequests "

'Ouvrir la connection
Set dbConn = Server.CreateObject("ADODB.Connection")
dbConn.Open dbConnString

'Ouvrir le Recordset en mode "Forward-Only" via .Execute()
Set rs = dbConn.Execute(strSQL)
%>


Contourner les dates à Zéro







Au service de votre ASP Classic





Préférences de vie privéePréférences relatives à vos données personnelles

NOTE : Vos changements seront appliqués dès la prochaine page que vous visiterez/chargerez.

Votre vie privée est précieuse : nous la respectons.

En utilisant ce site, vous acceptez que nous utilisions des statistiques anonymes pour analyser notre trafic et améliorer votre expérience de navigation sur notre site, ainsi que des technologies et cookies pour personnaliser le contenu. Ces informations anonymes peuvent être partagées avec nos partenaires de médias sociaux et d'analyse de confiance.

  • Nous ne collectons aucune donnée nominative.
  • Nous ne stockons aucun mot de passe.
  • Nous utilisons une connexion sécurisée de haut niveau.