Los tipos DATETIME
, DATE
,
and TIMESTAMP
están relacionados. Esta
sección describe sus características, en qué se parecen y en
qué 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 caracteres 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 caracteres 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 caracteres sin delimitadores en formato
'YYYYMMDDHHMMSS'
o
'YYMMDDHHMMSS'
, mientras que la cadena de
caracteres 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 caracteres sin delimitadores en formato
'YYYYMMDD'
o 'YYMMDD'
, mientras que el cadena de caracteres 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
o
YYMMDDHHMMSS
, mientras que el número
tenga sentido como fecha. Por ejemplo,
19830905132800
y
830905132800
se interpretan como
'1983-09-05 13:28:00'
.
Como número en formato YYYYMMDD
o
YYMMDD
, mientras que el número tenga
sentido como fecha. Por ejemplo, 19830905
y 830905
se interpretan como
'1983-09-05'
.
Como resultado de una función que retorne un valor
acceptable en un contexto DATETIME
,
DATE
, o TIMESTAMP
,
como NOW()
o
CURRENT_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 caracteres 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 caracteres 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. A los números que
no tengan estas longitudes se les añaden ceros a la izquierda
hasta la longitud más cercana permitida.
Los valores especificados como cadenas de caracteres no
delimitadas se interpretan usando su longitud. Si la cadena de
caracteres tiene longitud 8 o 14, el año se asume como dado por
los primeros 4 caracteres. En el resto de caso, se supone que el
año lo dan los primeros 2 caracteres. La cadena de caracteres
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 caracteres. Esto significa que no debe
usar cadenas de caracteres con menos de 6 caracteres. 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 objeto
DATETIME
o TIMESTAMP
,
la parte de hora del valor resultante se cambia a
'00:00:00'
ya que el valor
DATE
no contiene información temporal.
Si asigna un valor DATETIME
o
TIMESTAMP
a un objeto
DATE
, la parte temporal del valor
resultante se borra porque el tipo DATE
no tiene información temporal.
Tenga en cuenta que aunque DATETIME
,
DATE
, y TIMESTAMP
pueden especificarse usando el mismo conjunto de formatos,
los tipos no tienen el mismo rango de valores. Por ejemplo,
TIMESTAMP
no pueden ser anteriores a
1970
o posteriores a
2037
. Esto significa que una fecha como
'1968-01-01'
, que sería legal como
DATETIME
o DATE
no es
un valor válido TIMESTAMP
y se convierte
a 0
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 caracteres 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 a
2000-2069
.
Los valores de años en el rango
70-99
se convierten a
1970-1999
.
É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.