Les types DATETIME
, DATE
et TIMESTAMP
sont proches. Cette section décrit leur caractéristiques, et montre en quoi ils sont similaires, et en quoi ils sont différents.
Le type DATETIME
est utile pour manipuler en même temps une date et une heure. . MySQL retourne et affiche les valeurs de type DATETIME
au format 'YYYY-MM-DD HH:MM:SS'.
L'intervalle valide pour le type DATETIME
est '1000-01-01 00:00:00'
à '9999-12-31 23:59:59'
. (``valide`` signifie que des valeurs anciennes pourrait fonctionner, mais qu'il n'y a aucune garantie).
Le type DATE
est utilisé pour manipuler simplement une date, sans l'heure. MySQL retourne et affiche les valeurs de type DATE
au format 'YYYY-MM-DD'
L'intervalle valide pour le type DATE
est '1000-01-01'
à '9999-12-31'
Le type TIMESTAMP
est utilisé automatiquement lors de requête , avec la valeur courante de date et d'heure. Si il y a plusieurs colonnes de type TIMESTAMP
, seule la première sera automatiquement mise à jour.
La datation automatique intervient sur la première colonne de type TIMESTAMP
, et dans les conditions suivantes :
- La colonne n'est pas expressément nommée dans la requête
INSERT
ou LOAD DATA
- La colonne n'est pas expressément nommée dans une requête , et au moins une autre colonne change
UPDATE
de valeur (Il est important de noter qu'une requête UPDATE
qui affecterait la même valeur que celle qui est déjà affectée dans la colonne, alors la colonne TIMESTAMP
ne sera pas mise à jour, car MySQL va ignorer la requête, par souci d'efficacité.)
- La colonne
TIMESTAMP
est explicitement mise à NULL.
Dans le cas où il y a plusieurs colonnes de type TIMESTAMP
, il est possible d'affecter la valeur courante de date et d'heure, en affectant la valeur NULL
ou NOW()
.
Il est possible d'affecter n'importe quelle date à une colonne de type TIMESTAMP
, en lui affectant explicitement la valeur désirée. Cela est vrai pour toutes les colonnes de type TIMESTAMP
, y compris la première. Par exemple, il est possible d'utiliser une colonne de type pour enregistrer le moment de création de la ligne, mais qui ne sera plus changé par la suite.:
- Il suffit de laisser MySQL affecter la valeur automatiquement lors de la création de la ligne. L'initalisation sera faite au jour et heure courante.
- Lors des modifications ultérieurs, il suffit d'affecter à la colonne sa propre valeur.
Ou alors, il est aussi simple d'utiliser une colonne de type DATETIME
, qui sera initialisé à l'aide de la commande NOW()
, et qui ne sera plus jamais modifiée.
TIMESTAMP
couvre un espace de temps qui commence en 1970 et se termine quelques par en 2037, avec un précision d'une seconde. Ses valeurs sont affichée comme des nombres.
Le format utilisé par pour retourner les valeurs de type dépendent de la taille de l'affichage, comme présenté ci dessous. Un complet affiche 14 chiffres, mais il est possible de n'afficher qu'une partie.
Column type | Display format
|
TIMESTAMP(14) | YYYYMMDDHHMMSS
|
TIMESTAMP(12) | YYMMDDHHMMSS
|
TIMESTAMP(10) | YYMMDDHHMM
|
TIMESTAMP(8) | YYYYMMDD
|
TIMESTAMP(6) | YYMMDD
|
TIMESTAMP(4) | YYMM
|
TIMESTAMP(2) | YY
|
Toutes les colonnes de type ont besoin de la même quantité de mémoire, quelque soit le format d'affichage. Les formats d'affichage les plus courants sont le 6, le 8, le 12 et le 14. Il est possible d'imposer une taille arbitraire au format d'affichage au moment de la création de la table, mais 0 et toutes les valeurs supérieures à 14 seront ramenées à 14. Les valeurs impaires entre 1 et 13 sont arrondies au nombre entier pair supérieur.
Il est possible d'affecter des valeurs de type DATETIME
, DATE
et TIMESTAMP
en utilisant n'importe lequel des formats suivants :
- Une chaîne, avec le format
'YYYY-MM-DD HH:MM:SS'
ou 'YY-MM-DD HH:MM:SS'
. Les '-' et ' :' ne sont pas obligatoires, et n'importe quel caractère non numérique. Par exemple, '98-12-31 11:30:45'
, '98.12.31 11+30+45'
, '98/12/31 11*30*45'
et '98@12@31 11^30^45' sont équivalents.
- Une chaîne, avec le format
'YYYY-MM-DD'
ou 'YY-MM-DD'
. Les '-' et ' :' ne sont pas obligatoires, et ils peuvent être remplacé par quel caractère non numérique. Par exemple, '98-12-31'
, '98.12.31'
, '98/12/31'
et '98@12@31'
sont équivalents.
- Une chaîne sans aucun délimiteur, avec le format
'YYYYMMDDHHMMSS'
ou 'YYMMDDHHMMSS'
, en supposant que cette chaîne a bien un sens en tant que date. Par exemple, '19970523091528'
et '970523091528
seront comprises comme '1997-05-23 09:15:28'
.Au contraire, '971122459015'
n'est pas valide (le nombre de seconde n'est pas valide), et sera remplacé par : '0000-00-00 00:00:00'
.
- Une chaîne sans aucun délimiteur, avec le format
'YYYYMMDD'
or 'YYMMDD'
, en supposant que cette chaîne a bien un sens en tant que date. Par exemple, '19970523'
et '970523'
seront comprises comme '1997-05-23'
.Au contraire, '971332'
n'est pas valide (le nombre de mois et de jour ne sont pas valides), et sera remplacé par : '0000-00-00'
.
- Un nombre avec le format
YYYYMMDDHHMMSS
or YYMMDDHHMMSS
, en supposant que cette chaîne a bien un sens en tant que date. Par exemple, 19830905132800
et 830905132800
seront comprises comme '1983-09-05 13:28:00'
- Un nombre avec le format
YYYYMMDD
or YYMMDD
, en supposant que cette chaîne a bien un sens en tant que date. Par exemple, 19830905132800
et 830905132800
seront comprises comme '1983-09-05 13:28:00'
- Le résultat d'une fonction qui retourne une valeur acceptable en dans un contexte de
DATETIME
, DATE
or TIMESTAMP
, comme NOW()
or CURRENT_DATE.
Toutes les valeurs de type DATETIME
, DATE
ou TIMESTAMP
sont converties automatiquement en ``zero'' du même type ('0000-00-00 00:00:00'
, '0000-00-00'
ou 00000000000000
).
Pour les valeurs spécifiées au format chaîne avec des délimiteurs, il n'est pas nécessaire de préciser les deux chiffres pour les mois ou les jours. Par exemple, '1979-6-9'
et '1979-06-09'
sont identiques. De la même façon, pour les valeurs spécifiées au format chaîne avec des délimiteurs, il n'est pas nécessaire de préciser les deux chiffres pour les heures, minutes ou secondes. Ainsi, '1979-10-30 1:2:3'
et '1979-10-30 01:02:03'
sont identiques.
Les valeurs spécifiée au format nombre doivent avoir 6, 8, 12 ou 14 chiffres. Si le nombre a 8 ou 14 chiffres, MySQL utilisera respectivement le format YYYYMMDD
ou YYYYMMDDHHMMSS
, où l'année sera représentée par les quatre premiers chiffres. Si le nombre a 6 ou 12 chiffres, MySQL utilisera respectivement le format YYMMDD
or YYMMDDHHMMSS
, où l'année sera représentée par les deux premiers chiffres. Si le nombre n'a pas le bon nombre de chiffre, il sera complété avec des zéros non significatif (placés avant le premier chiffre), jusqu'à correspondre à une taille analysable.
Les valeurs non délimitées, sont interprétées en fonction de leur longueur. Si la chaîne fait 8 ou 14 caractères, l'année sera considérée comme ayant 4 chiffres. Sinon, l'année n'aura que les deux premiers chiffres. La chaîne est interprétée de gauche à droite, en lisant successivement l'année, le mois, le jour, l'heure, la minute et la seconde, dans la mesure où la chaîne est suffisamment longue. Cela implique qu'il ne faut pas utiliser de chaîne de moins de 6 caractères. Par exemple, la chaîne '9903'
, qui pourrait s'interpréter mars 1999, sera remplacée par la date ``zéro''. En effet, est capable de trouver l'année (99) et le mois (03) mais pas le jour (00), et donc cette valeur n'est pas valide.
Les colonnes de type TIMESTAMP
enregistre les dates avec la précision maximum, quelque soit la taille d'affichage. Cela a plusieurs implications :
- Il faut toujours préciser l'année, le mois et le jour, même si le type de la colonne est
TIMESTAMP(4)
ou TIMESTAMP(2)
. Sinon, la valeur ne sera pas valide, et donc, remplacée par ``zéro''.
- Si la structure de la table est modifié avec , pour agrandir la colonne, l'affichage présentera des données qui étaient précédemment cachées.
- De la même façon, réduire la taille d'affichage d'une colonne
TIMESTAMP
ne causera pas de perte d'information : elles seront simplement cachées.
- Bien que les valeurs
TIMESTAMP
soient en précision maximale, la seul fonction qui opère directement sur la valeur enregistrée dans la base est UNIX_TIMESTAMP()
. Les autres fonctions utilisent la valeur formatée. Cela signifie qu'il n'est pas possible d'utiliser une fonction telle que HOUR()
ou SECOND()
à moins que la partie significative de TIMESTAMP
soit inclus dans la valeur formatée. Par exemple, la partie HH
d'une valeur de type TIMESTAMP
ne sera pas affichée, à moins que la taille de l'affichage soit au moins de 10. Ainsi, utiliser la fonction sur une valeur de type de taille inférieure à 10 risque de retourner une valeur incohérente.
Il est possible d'affecter des valeurs de type date dans une variable d'un autre type date. Cependant, cela peut engendrer des altérations ou des pertes d'informations. :
- Lors de l'affectation d'une
DATE
dans une variable de type DATETIME
ou TIMESTAMP
, la partie heure du résultat est mis à '00:00:00'
, car la valeur DATE
ne contient aucune information d'heure.
- Lors de l'affectation d'une
DATETIME
ou TIMESTAMP
dans une variable de type DATE
, la partie heure du résultat est perdue , car la valeur DATE
ne contient aucune information d'heure.
- Il ne faut pas confondre les différents formats de spécifications des
DATETIME
, DATE
et TIMESTAMP
. En effet, pour le même format d'acquisition, les différents types n'ont pas le même intervalle de validité. Par exemple, TIMESTAMP
ne peut contenir de valeur antérieure à 1970
ou postérieure à 2037
. Cela signifie qu'une date telle que as '1968-01-01'
, tout en étant valide pour les types DATETIME
or DATE
, n'est pas valide pour le type TIMESTAMP
et sera transformée en 0, lors de l'affectation à un tel objet.
Attention aussi aux erreurs de spécifications :
- En utilisant la forme de spécification avec délimiteurs, comme les délimiteurs ne sont pas imposé, il est possible d'être induit en erreur par la forme : Ainsi,
'10:11:12'
ressemble à une heure, à cause des délimiteurs " : ". Mais, utilisé dans un contexte de date, il peut aussi être interprété comme la date'2010-11-12'
. De même, la valeur '10:45:15'
sera convertie en 0, car 45 ,'est pas un mois valide.
- Les années spécifiées sur deux chiffres sont ambiguës :
- Les années qui sont dans l'intervalle
00-69
sont considéré comme 2000-2069
.
- Les années qui sont dans l'intervalle
70-99
sont considéré comme 1970-1999
.