Los tipos de fecha y hora para representar valores temporales son
DATETIME
, DATE
,
TIMESTAMP
, TIME
, y
YEAR
. Cada tipo temporal tiene un rango de
valores legales, así como un valor “zero” que se usa
cuando se especifica un valor ilegal que MySQL no puede
representar. El tipo TIMESTAMP
tiene un
comportamiento automático especial, descrito posteriormente.
Desde MySQL 5.0.2, MySQL da advertencias/errores si trata de
insertar una fecha ilegal. Puede hacer que MySQL acepte ciertas
fechas, tales como '1999-11-31'
, usando el modo
SQL ALLOW_INVALID_DATES
. (Antes de 5.0.2, este
modo era el comportamiento por defecto de MySQL). Esto es útil
cuando quiere almacenar el valor “posiblemente
erróneo” que el usuario especifica (por ejemplo, en un
formulario web) en la base de datos para un posterior
procesamiento. En este modo, MySQL sólo verifica que el mes esté
en el rango de 0 a 12 y que el día esté en el rango de 0 a 31.
Estos rangos incluyen cero ya que MySQL permite almacenar fechas
cuando el día o el mes son cero en columnas
DATE
o DATETIME
. Esto es
muy útil para aplicaciones que necesiten almacenar una fecha de
nacimiento para la que no sepa la fecha exacta. En este caso,
símplemente almacena la fecha como
'1999-00-00'
o '1999-01-00'
.
Si almacena valores similares a estos, no debe esperar obtener
resultados correctos para funciones tales como
DATE_SUB()
or DATE_ADD
que
necesitan fechas completas. (Si no quiere permitir ceros en las
fechas, puede usar el modo SQL NO_ZERO_IN_DATE
).
MySQL permite almacenar '0000-00-00'
como
“fecha de pruebas” (si no está usando el modo SQL
NO_ZERO_DATE
). Esto es mejor que usar (y usa
menos espacio de datos e índice) que usar valores
NULL
.
Modificando la variable de sistema sql_mode
al
modo apropiado, puede especificar exactamente qué tipos de datos
quiere soportar con MySQL. Consulte
Sección 5.3.2, “El modo SQL del servidor”.
Aquí hay algunas consideraciones generales a tener en cuenta cuando se trabaja con tipos de fecha y hora:
-
MySQL muestra los valores para una fecha o hora en un formato de salida estándard, pero trata de intepretar una variedad de formatos para los valores de entrada que se proporcionan (por ejemplo, cuando especifica un valor para asignar o comparar con un tipo fecha o hora). Sólo los formatos descritos en las siguientes secciones son soportados. Se espera la entrada de valores legales. Si se usan otros formatos pueden ocurrir resultados imprevisibles.
-
Las fechas con años de dos dígitos son ambituas, ya que no se sabe el siglo. MySQL interpreta los años de dos dígitos usando las siguientes reglas:
-
Los años del rango
70-99
se convierten en1970-1999
. -
Los años del rango
00-69
se convierten en2000-2069
.
-
-
Aunque MySQL trata de interpretar los valores con varios formatos, las fechas siempre deben darse en el orden año-mes-día (por ejemplo,
'98-09-04'
), en lugar del formato mes-día-año o día-mes-año usados comunmente (por ejemplo,'09-04-98'
,'04-09-98'
). -
MySQL convierte automáticamente una fecha o hora a un número si el valor se usa en un contexto numérico y viceversa.
-
Cuando MySQL encuentra un valor para fecha o hora que está fuera de rango o es ilegal para el tipo (como se describe al inicio de la sección), lo convierte al valor “cero” para ese tipo. La excepción es que los valores fuera de rango del tipo
TIME
se reemplazan por el valor límite de rango apropiado para el tipoTIME
.La siguiente tabla muestra el formato del valor “cero” para cada tipo. Tenga en cuenta que el uso de estos valores produce mensajes de advertencia si el modo SQL
NO_ZERO_DATE
está activado.Tipo de Columna “Cero” Valor DATETIME
'0000-00-00 00:00:00'
DATE
'0000-00-00'
TIMESTAMP
00000000000000
TIME
'00:00:00'
YEAR
0000
-
Los valores “cero” son especiales, pero puede almacenarlos o referirse a ellos explícitamente usando los valores mostrados en la tabla. También puede hacerlo usando los valores
'0'
o0
, que son más sencillos de escribir. -
Los valores de fecha o hora “cero” usados a través de MyODBC se convierten automáticamente a
NULL
en MyODBC 2.50.12 y posterior, ya que ODBC no puede tratar estos valores.
Los tipos DATETIME
, DATE
,
and TIMESTAMP
están relacionados. Esta
sección describe sus características, en que se parecen y en
que difieren.
El tipo DATETIME
se usa cuando necesita
valores que contienen información de fecha y hora. MySQL recibe
y muestra los valores DATETIME
en formato
'YYYY-MM-DD HH:MM:SS'
. El rango soportado es
de '1000-01-01 00:00:00'
a
'9999-12-31 23:59:59'
.
(“Soportado” significa que aunque valores
anteriores pueden funcionar, no hay garantías)
El tipo DATE
se usa cuando necesita sólo un
valor de fecha, sin una parte de hora. MySQL recibe y muestra
los valores DATE
en formato
'YYYY-MM-DD'
. El rango soportado es de
'1000-01-01'
a
'9999-12-31'
.
El tipo TIMESTAMP
tiene varias propiedades,
en función de la versión de MySQSL y el modo SQL que esté
ejecutando el servidor. Estas propiedades se describen
posteriormente en esta sección.
Puede especificar valores DATETIME
,
DATE
, y TIMESTAMP
usando
cualquier de los siguientes formatos:
-
Como cadena de carácteres en formato
'YYYY-MM-DD HH:MM:SS'
o'YY-MM-DD HH:MM:SS'
. Una sintaxis “relajada” se permite: Cualquier carácter de puntuación puede usarse como delimitador entre partes de fecha o de hora. Por ejemplo,'98-12-31 11:30:45'
,'98.12.31 11+30+45'
,'98/12/31 11*30*45'
, y'98@12@31 11^30^45'
son equivalentes. -
Como cadena de carácteres en formato
'YYYY-MM-DD'
or'YY-MM-DD'
. Se permite una sintaxis “relajada” . Por ejemplo,'98-12-31'
,'98.12.31'
,'98/12/31'
, y'98@12@31'
son equivalentes. -
Como cadena de carácteres sin delimitadores en formato
'YYYYMMDDHHMMSS'
o'YYMMDDHHMMSS'
, mientras que la cadena de carácteres tenga sentido como fecha. Por ejemmplo,'19970523091528'
y'970523091528'
se interpretan como'1997-05-23 09:15:28'
, pero'971122129015'
es ilegal (tiene una parte de minutos sin sentido) y se convierte en'0000-00-00 00:00:00'
. -
Como cadena de carácteres sin delimitadores en formato
'YYYYMMDD'
o'YYMMDD'
, mientras que el cadena de carácteres tenga sentido como fecha. Por ejemplo,'19970523'
y'970523'
se interpretan como'1997-05-23'
, pero'971332'
es ilegal (tiene una parte de mes y día sin sentido) y se convierte en'0000-00-00'
. -
Como número en formato
YYYYMMDDHHMMSS
oYYMMDDHHMMSS
, mientras que el número tenga sentido como fecha. Por ejemplo,19830905132800
y830905132800
se interpretan como'1983-09-05 13:28:00'
. -
Como número en formato
YYYYMMDD
oYYMMDD
, mientras que el número tenga sentido como fecha. Por ejemplo,19830905
y830905
se interpretan como'1983-09-05'
. -
Como resultado de una función que retorne un valor acceptable en un contexto
DATETIME
,DATE
, oTIMESTAMP
, comoNOW()
oCURRENT_DATE
.
Los valores ilegales de DATETIME
,
DATE
, o TIMESTAMP
se
convierten al valor “cero” del tipo apropiado
('0000-00-00 00:00:00'
,
'0000-00-00'
, o
00000000000000
).
Para valores especificados como cadenas de carácteres que
incluyan partes de fecha delimitadas, no es necesario
especificar dos dígitos para valores de mes o día menores que
10
. '1979-6-9'
es lo mismo
que '1979-06-09'
. Similarmente, para valores
especificados como cadenas de carácteres que incluyan
delimitadores para la parte de hora, no es necesario especificar
dos dígitos para horas, minutos o segundos menores que
10
. '1979-10-30 1:2:3'
es
lo mismo que '1979-10-30 01:02:03'
.
Los valores especificados como números deben tener una longitud
de 6, 8, 12, o 14 dígitos. Si un número tiene una longitud de
8 o 14 dígitos, se asume que está en formato
YYYYMMDD
o YYYYMMDDHHMMSS
y que el año lo dan los primeros 4 dígitos. Si el número
tiene 6 o 12 dígitos de longitud, se asume que está en formato
YYMMDD
o YYMMDDHHMMSS
y
que el año lo dan los primeros 2 dígitos. Los números que no
tengan estas longitudes se interpretan como si tuvieran ceros a
la izquierda y fueran de la longitud permitida más cercana.
Los valores especificados como cadenas de carácteres no
delimitadas se interpretan usando su longitud. Si la cadena de
carácteres tiene longitud 8 o 14, el año se asume como dado
por los primeros 4 carácteres. En el resto de caso, se supone
que el año lo dan los primeros 2 carácteres. La cadena de
carácteres se interpreta de izquierda a derecha para encontrar
el año, mes, día, hora, minuto y segundo, para tantas partes
como representa la cadena de carácteres. Esto significa que no
debe usar cadenas de carácteres con menos de 6 carácteres. Por
ejemplo, si especifica '9903'
, pensando que
representa Marzo, 1999, MySQL inserta un valor
“cero” en la tabla. Esto es porque el valor de año
y mes son 99
y 03
, pero la
parte de día no se encuentra, así que el valor no es una fecha
legal. Sin embargo, puede especificar explícitamente un valor
de cero para representar partes de día y mes. Por ejemplo,
puede usar '990300'
para insertar el valor
'1999-03-00'
.
Puede asignar valores de un tipo a un objeto de un tipo diferente hasta un límite. Sin embargo, hay algunas alteraciones del valor o pérdidas de información:
-
Si asigna un valor
DATE
a un objetoDATETIME
oTIMESTAMP
, la parte de hora del valor resultante se cambia a'00:00:00'
ya que el valorDATE
no contiene información temporal. -
Si asigna un valor
DATETIME
oTIMESTAMP
a un objetoDATE
, la parte temporal del valor resultante se borra porque el tipoDATE
no tiene información temporal. -
Tenga en cuenta que aunque
DATETIME
,DATE
, yTIMESTAMP
pueden especificarse usando el mismo conjunto de formatos, los tipos no tienen el mismo rango de valores. Por ejemplo,TIMESTAMP
no pueden ser anteriores a1970
o posteriores a2037
. Esto significa que una fecha como'1968-01-01'
, que sería legal comoDATETIME
oDATE
no es un valor válidoTIMESTAMP
y se convierte a0
si se asigna a un objeto de este tipo.
Tenga en cuenta ciertas cosas al especificar valores temporales:
-
El formato relajado para valores especificados como cadenas de carácteres puede ser problemático. Por ejemplo, un valor como
'10:11:12'
puede parecer una hora por el delimitador ':
' , pero si se usa en un contexto de fecha se interpreta como'2010-11-12'
. El valor'10:45:15'
se convierte a'0000-00-00'
ya que'45'
no es un mes legal. -
El servidor MySQL realiza sólo chequeo básico de la validez de las fechas: Los rangos para año, mes y día son de 1000 a 9999, 00 a 12, y 00 a 31, respectivamente. Cualquier fecha que contenga partes fuera de estos rangos está sujeta a conversión a
'0000-00-00'
. Tenga en cuenta que esto permite almacenar fechas inválidas como'2002-04-31'
. Para asegurar que una fecha es válida, haga una comprobación en su aplicación. -
Fechas con valores de año de dos dígitos son ambíguas porque no se conoce el siglo. MySQL interpreta los años de dos dígitos usando las siguientes reglas:
-
Los valores de años en el rango
00-69
se convierten a2000-2069
. -
Los valores de años en el rango
70-99
se convierten a1970-1999
.
-
Nota: En antiguas versiones
de MySQL (antes de la 4.1), las propiedades de las columnas
TIMESTAMP
difieren significativamente en
muchas cosas de lo que se describe en esta sección. Si
necesita convertir datos TIMESTAMP
antiguos
para que funcionen con MySQL 5.0, asegúrese de consultar
Manual de referencia de MySQL 4.1 para más detalles.
En MySQL 5.0, TIMESTAMP
se muestran en el
mismo formato que las columnas DATETIME
. En
otras palabras, el ancho de muestra se limita a 19
carácteres, y el formato es YYYY-MM-DD
HH:MM:SS
.
El servidor MySQL puede ejecutarse en modo
MAXDB
. Cuando el servidor corre en este
modo, TIMESTAMP
es idéntico a
DATETIME
. Esto es, si el servidor está
ejecutándose en modo MAXDB
cuando se crea
una tabla, las columnas TIMESTAMP
se crean
como columnas DATETIME
. Como resultado,
tales columnas usan el formato de salida de
DATETIME
, tienen el mismo rango de valores,
y no hay inicialización automática o actualización de la
fecha y hora actual.
Para activar el modo MAXDB
, cambie el modo
SQL del servido aMAXDB
cuando arranque
usando la opción --sql-mode=MAXDB
o
cambiando en tiempo de ejecución la variable global
sql_mode
:
mysql> SET GLOBAL sql_mode=MAXDB;
Un cliente puede hacer que el servidor se ejecute en modo
MAXDB
para sus propias conexiones como se
muestra:
mysql> SET SESSION sql_mode=MAXDB;
Desde MySQL 5.0.2, MySQL no acepta valores timestamp que
incluyan cero en la columna de día o hora o valores que no
sean fechas válidas. La única excepción es el valor
especial '0000-00-00 00:00:00'
.
En MYSQL 5.0, tiene considerable flexibilidad para determinar
cuando se actualiza e inicializa automáticamente
TIMESTAMP
y qué columna debe tener ese
comportamiento:
-
Puede asignar la fecha y hora actual como el valor por defecto y el valor de actualización automático, como se hacía anteriormente. Pero es posible tener sólo uno u otro comportamiento automático, o ninguno de ellos. (No es posible tener un comportamiento para una columna y el otro para la otra columna.)
-
Puede especificar qué columna
TIMESTAMP
inicializar o actualizar con la fecha y hora actuales. Ya no hace falta que sea la primera columnaTIMESTAMP
.
Tenga en cuenta que la información en la siguiente discusión
se aplica a columnas TIMESTAMP
sólo para
tablas no creadas con el modo MAXDB
activado. (Como se menciona anteriormente, el modo
MAXDB
hace que las columnas se creen como
columnas DATETIME
.) Las reglas que
gobiernan la inicialización y actualización de columnas
TIMESTAMP
en MySQL 5.0 son las siguientes:
-
Si un valor
DEFAULT
se especifica para la primera columnaTIMESTAMP
en una tabla, no se ignora. El valor por defecto puede serCURRENT_TIMESTAMP
o una fecha y hora constante. -
DEFAULT NULL
es lo mismo queDEFAULT CURRENT_TIMESTAMP
para la primera columnaTIMESTAMP
. Para cualquier otra columnaTIMESTAMP
,DEFAULT NULL
se trata comoDEFAULT 0
. -
Cualquier columna
TIMESTAMP
individual en una tabla puede actualizarse e inicializarse con la fecha y hora actual automáticamente. -
En un comando
CREATE TABLE
, la primera columnaTIMESTAMP
puede declararse de cualquiera de las siguientes formas:-
Con las cláusulas
DEFAULT CURRENT_TIMESTAMP
yON UPDATE CURRENT_TIMESTAMP
, la columna tiene la fecha y hora actual como su valor por defecto, y se actualiza automáticamente. -
Sin las cláusulas
DEFAULT
niON UPDATE
, es lo mismo queDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
. -
Con la cláusula
DEFAULT CURRENT_TIMESTAMP
y sinON UPDATE
, la columna tiene la fecha y hora actual como valor por defecto pero no se actualiza automáticamente. -
Sin cláusula
DEFAULT
y con cláusulaON UPDATE CURRENT_TIMESTAMP
, la columna tiene por defecto 0 y se actualiza automáticamente. -
Con un valor constante
DEFAULT
, la columna tiene el valor dado por defecto. Si la columna tiene una cláusulaON UPDATE CURRENT_TIMESTAMP
se actualiza automáticamente, de otro modo no lo hace.
En otras palabras, puede usar la fecha y hora actuales para el valor inicial y el valor de actualización automática, o uno de ellos o ninguno. (Por ejemplo, puede especificar
ON UPDATE
para activar actualización automática sin tener la columna inicializada .) -
-
Cualquiera de
CURRENT_TIMESTAMP
,CURRENT_TIMESTAMP()
, oNOW()
puede usarse en las cláusulasDEFAULT
yON UPDATE
. Todas tienen el mismo efecto.El orden de los dos atributos no importa. Si se especifican
DEFAULT
yON UPDATE
para una columnaTIMESTAMP
, cualquiera puede preceder al otro.Ejemplo. Estos comandos son equivalentes:
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
-
Para especificar el valor por defecto o actualización automática para una columna
TIMESTAMP
distinta a la primera, debe suprimir la actualización e inicialización automática de la primera columnaTIMESTAMP
asignándole explícitamente una valor constanteDEFAULT
(por ejemplo,DEFAULT 0
oDEFAULT '2003-01-01 00:00:00'
). Luego, para la otra columnaTIMESTAMP
, las reglas son las mismas que para la misma columnaTIMESTAMP
, excepto que no puede omitir ambas cláusulasDEFAULT
yON UPDATE
. Si lo hace, no habrá inicialización ni actualización automática.Ejemplo, estos comandos son equivalentes:
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
En MySQL 5.0, puede asignar la zona horaria actual para cada
conexión, como se describe en
Sección 5.9.8, “Soporte de zonas horarias en el servidor MySQL”. Los valores
TIMESTAMP
se almacenan en UTC,
convirtiéndose desde la zona horaria actual para
almacenamiento, y volviéndose a convertir a la zona horaria
actual al mostrarse. Mientras la zona horaria permanezca
constante, puede obtener el mismo valor que hay almacenado. Si
almacena un valor TIMESTAMP
, cambia la zona
horaria y luego rescata el valor, es diferente que el valor
almacenado. Esto ocurre porque no se usa la misma zona horaria
para la conversión en ambas direcciones. La zona horaria
actual está disponible en la variable de sistema
time_zone
.
Puede incluir el atributo NULL
en la
definición de una columna TIMESTAMP
para
permitir que la columna contenga valores
NULL
. Por ejemplo:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
Si el atributo NULL
no se especifica,
asignar el valor NULL
a la columna resulta
en que se almacena la hora y fecha actuales. Tenga en cuenta
que una columna TIMESTAMP
que permita
valores NULL
no no almacenará la fecha y
hora actual a no ser que su valor por defecto se defina como
CURRENT_TIMESTAMP
,
o NOW()
o
CURRENT_TIMESTAMP
se inserte en la columna.
En otras palabras, una columna TIMESTAMP
definida como NULL
se actualizará
automáticamente sólo si se crea usando una definición como
las siguientes:
CREATE TABLE t (ts NULL DEFAULT CURRENT_TIMESTAMP);
De otro modo - esto es, si la columna
TIMESTAMP
se define usando
NULL
pero no usando DEFAULT
TIMESTAMP
, como se muestra aquí...
CREATE TABLE t1 (ts NULL DEFAULT NULL); CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...entonces debe insertar el valor explícitamente correspondiente a la fecha y hora actuales. Por ejemplo:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
MySQL devuelve y muestra los valores TIME
en
formato 'HH:MM:SS'
(o formato
'HHH:MM:SS'
para valores de hora grandes).
TIME
tiene rango de
'-838:59:59'
a
'838:59:59'
. La razón por la que la parte de
hora puede ser tan grande es que el tipo TIME
puede usarse no sólo para representar una hora del día (que
debe ser menor a 24 horas), pero también el tiempo transcurrido
o un intervalo de tiempo entre dos eventos (que puede ser mucho
mayor a 24 horas, o incluso negativo).
Puede especificar valores TIME
en una
variedad de formatos:
-
Como cadena de carácteres en formato
'D HH:MM:SS.fracción'
. También puede usar una de las siguientes sintaxis “relajadas” :'HH:MM:SS.fracción'
,'HH:MM:SS'
,'HH:MM'
,'D HH:MM:SS'
,'D HH:MM'
,'D HH'
, o'SS'
. AquíD
representa días y puede tener un valor de 0 a 34. Tenga en cuenta que MySQL no almacena la fracción (todavía). -
Como cadena de carácteres sin delimitadores en formato
'HHMMSS'
, mientras que tenga sentido como hora. Por ejemplo,'101112'
se entiende como'10:11:12'
, pero'109712'
es ilegal (no tiene una parte de minutos correcta) y pasa a ser'00:00:00'
. -
Como número en formato
HHMMSS
, mientras tenga sentido como hora. Por ejemplo,101112
se entiende como'10:11:12'
. Los siguientes formatos alternativos también se entienden:SS
,MMSS
,HHMMSS
,HHMMSS.fracción
. Tenga en cuenta que MySQL no almacena la fracción (todavía). -
Como resultado de una función que retorna un valor que es aceptable en un contexto
TIME
, tal comoCURRENT_TIME
.
Para valores TIME
especificados como cadenas
de carácteres que incluyan un delimitador de las partes de
hora, no es necesario especificar dos dígitos para horas,
minutos o segundos que tengan un valor inferior a
10
. '8:3:2'
es lo mismo
que '08:03:02'
.
Tenga cuidado con asignar valores abreviados a una columna
TIME
. Sin comas, MySQL interpreta los
valores asumiendo que los dos dígitos más a la derecha
representan segundos. (MySQL interpreta valores
TIME
como tiempo transcurrido en lugar de
horas del día.) Por ejemplo puede pensar que
'1112'
y 1112
significan
'11:12:00'
(12 minutos tras las 11 en punto),
pero MySQL los interpreta como '00:11:12'
(11
minutos, 12 segundos). Similarmente, '12'
y
12
se interpretan como
'00:00:12'
. Los valores
TIME
con comas, por contrario, se tratan
siempre como hora del día. Esto es, '11:12'
significa '11:12:00'
, no
'00:11:12'
.
Los valores fuera del rango de TIME
pero que
son legales se cambian por el valor límite de rango más
cercano. Por ejemplo '-850:00:00'
y
'850:00:00'
se convierten en
'-838:59:59'
y
'838:59:59'
.
Valores TIME
ilegales se convierten a
'00:00:00'
. Tenga en cuenta que como
'00:00:00'
es un valor
TIME
legal, no hay forma de decir si un valor
'00:00:00'
almacenado en una tabla, se
insertó como '00:00:00'
o como valor ilegal.
El tipo YEAR
es un tipo de un byte usado para
representar años.
MySQL devuelve y muestra los valores YEAR
en
formato YYYY
. El rango es de
1901
a 2155
.
Puede especificar los valores YEAR
en una
variedad de formatos:
-
Como cadena de carácteres de cuatro dígitos en el rango de
'1901'
a'2155'
. -
Como número de cuatro dígitos en el rango de
1901
a2155
. -
Como cadena de carácteres de dos dígitos en el rango de
'00'
a'99'
. Los valores en los rangos de'00'
a'69'
y de'70'
a'99'
se convierten en valoresYEAR
en el rango de2000
a2069
y de1970
a1999
. -
Como número de dos dígitos en el rango de
1
a99
. Los valores en los rangos de1
a69
y de70
a99
se convierten en valoresYEAR
en los rangos de2001
a2069
y de1970
a1999
. Tenga en cuenta que el rango para números de dos dígitos es ligeramente distinto del rango para cadenas de carácteres de dos dígitos, ya que no especifica el cero directamente como número y tiene que ser interpretado como2000
. Debe especificarlo como cadena de carácteres'0'
o'00'
o se interpreta como0000
. -
Como resultado de una función que retorne un valor que se acepte en un contexto
YEAR
, comoNOW()
.
Valores YEAR
ilegales se convierten en
0000
.
MySQL no tiene problemas con el año 2000 (Y2K) (consulte Sección 1.4.5, “Conformidad con el efecto 2000”), pero los valores de entrada presentados a MySQL pueden tenerlos. Cualquier entrada con valores de años de dos dígitos es ambigua, ya que no se conoce el siglo. Tales valores deben interpretarse en forma de cuatro dígitos, ya que MySQL los almacena internamente usando cuatro dígitos.
Para tipos DATETIME
, DATE
,
TIMESTAMP
, y YEAR
, MySQL
interpreta las fechas con valores de año ambíguos usando las
siguientes reglas:
-
Años en el rango
00-69
se convierten a2000-2069
. -
Años en el rango
70-99
se convierten a1970-1999
.
Recuerde que estas reglas proporcionan sólo suposiciones razonables sobre lo que significan los valores. Si el heurístico usado por MySQL no produce los valores correctos, debe proporcionar entrada no ambígua con años de cuatro dígitos.
ORDER BY
ordena valores
TIMESTAMP
o YEAR
correctamente que tengan años de dos digitos.
Algunas funciones como MIN()
y
MAX()
convierten un
TIMESTAMP
o YEAR
a
número. Esto significa que un valor con un año de dos dígitos
no funciona correctamente con estas funciones. En este caso la
solución es convertir TIMESTAMP
o
YEAR
a formato de cuatro dígitos o usar algo
como MIN(DATE_ADD(timestamp,INTERVAL 0
DAYS))
.