El format de un valor DATE
es
'YYYY-MM-DD'
. De acuerdo al estándar SQL
ningún otro formato se permite. Debería usar este formato en
las sentencias UPDATE
y en la cláusula
WHERE
de las sentencias
SELECT
. Por ejemplo:
mysql> SELECT * FROM nombre_de_tabla
WHERE date >= '2003-05-05';
Por motivos de conveniencia, MySQL convierte automáticamente
una fecha a un número si la fecha se utiliza en un contexto
numérico (y viceversa). Es también suficientemente inteligente
para permitir diversos formatos de cadena de caracteres cuando
se está actualizando y en las cláusulas
WHERE
que comparan una fecha con una columna
TIMESTAMP
, DATE
, o
DATETIME
. (Diversos formatos, significa que
puede utilizarse cualquier carácter de puntuación como
separador de las partes de la fecha. Por ejemplo,
'2004-08-15'
y
'2004#08#15'
son equivalentes.) MySQL
también puede convertir una cadena de caracteres que no
contenga separadores (como '20040815'
),
siempre que tenga sentido como fecha.
Cuando compara una colmna DATE
,
TIME
, DATETIME
, o
TIMESTAMP
a una cadena de caracteres
constante con los operadores <
,
<=
, =
,
>=
, >
, o
BETWEEN
, MySQL normalmente convierte la
cadena de caráteres a un entero largo interno para una
comparación más rápda (y también para hacer una comparación
algo más permisiva). Aún así, esta conversión está sujeta a
las siguientes restricciones:
Cuando compara dos columnas
Cuando usted compare columnas DATE
,
TIME
, DATETIME
, o
TIMESTAMP
con una expresión.
Cuando usted utilice cualquier otro método de comparación
que no sean aquellos recientemente citados, como
IN
o STRCMP()
.
Para estos casos excepcionales, la comparación se hace convirtiendo los objetos a cadenas de caracteres y realizando una comparación de cadenas de caracteres.
Para mantener todo a salvo, asuma que las fechas son comparadas como cadenas de caracteresy utilice las funciones de cadena de caracteres apropiadas para comparar un valor temporal con una cadena de caracteres.
La fecha especial '0000-00-00'
puede
almacenarse y recogerse como '0000-00-00'.
Cuando se utiliza una fecha '0000-00-00'
a
través de MyODBC, es convierte automáticamente en
NULL
en MyODBC 2.50.12 y superiores, porque
ODBC no puede gestionar este tipo de fechas.
Como MySQL realiza las conversiones anteriores, las siguientes sentencias funcionan:
mysql> INSERT INTOnombre_de_tabla
(idate) VALUES (19970505); mysql> INSERT INTOnombre_de_tabla
(idate) VALUES ('19970505'); mysql> INSERT INTOnombre_de_tabla
(idate) VALUES ('97-05-05'); mysql> INSERT INTOnombre_de_tabla
(idate) VALUES ('1997.05.05'); mysql> INSERT INTOnombre_de_tabla
(idate) VALUES ('1997 05 05'); mysql> INSERT INTOnombre_de_tabla
(idate) VALUES ('0000-00-00'); mysql> SELECT idate FROMnombre_de_tabla
WHERE idate >= '1997-05-05'; mysql> SELECT idate FROMnombre_de_tabla
WHERE idate >= 19970505; mysql> SELECT MOD(idate,100) FROMnombre_de_tabla
WHERE idate >= 19970505; mysql> SELECT idate FROMnombre_de_tabla
WHERE idate >= '19970505';
Pero lo siguente no funciona:
mysql> SELECT idate FROM nombre_de_tabla
WHERE STRCMP(idate,'20030505')=0;
STRCMP()
es una función de comparación de
cadenas, así que convierte idate
a una
cadena de caracteres en formato 'YYYY-MM-DD'
y realiza una comparación de cadenas. Es decir, NO convierte
'20030505'
en la fecha
'2003-05-05'
para realizar una comparación
de fechas.
Si está utilizando el modo SQL ALLOW_INVALID_DATES
(permitir fechas no válidas)
, MySQL le permite
almacenar las fechas que le proporciona con una comprobación
mínima: MySQL se asegura únicamente que el día esté en el
rango entre 1 y 31, y el mes en el rango entre 1 y 12.
Esto hace que MySQL sea muy convenienta para las aplicaciones web en que usted obtiene el año, mes y día en tres campos diferentes y quiere almacenar exactamente lo que el usuario insertó (sin validación de fechas).
Si no está utilizando el modo SQL
NO_ZERO_IN_DATE
, la parte del día o el mes
pueden ser cero. Esto es conveniente si quiere almacenar una
fecha de nacimiento en una columna DATE
y
solo conoce parte de esa fecha.
Si no está utlizando el modo SQL
NO_ZERO_DATE
, MySQL también le permite
almacenar '0000-00-00'
como fecha comodín.
En algunos momentos esto puede ser más adecuado que utilizar
valores NULL
.
Si la fecha no puede ser convertida a ningún valor razonable,
se almacena un 0
en la columna
DATE
, que se extrae como
'0000-00-00'
. Esto es una cuestión de
velocidad y conveniencia. Creemos que la responsabilidad del
servidor de bases de datos es recoger la misma fecha que usted
almacenó (aún cuando la fecha no fuese lógicamente correcta
en todos los casos). Creemos que es responsabilidad de la
aplicación y no del servidor comprobar las fechas.
Si quiere que MySQL compruebe todas las fechas y acepte solo las
que sean correctas (al menos que esto sea sobreseido por
IGNORE), debería establecer el modo SQL a
"NO_ZERO_IN_DATE,NO_ZERO_DATE"
.
La gestión de fechas en MySQL 5.0.1 y anteriores funciona como
en MySQL 5.0.2 con el modo SQL
ALLOW_INVALID_DATES
activado.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.