Esta sección describe las funciones que pueden usarse para manipular valores temporales. Consulte Sección 11.3, “Tipos de fecha y hora” para una descripción del rango de los valores que tiene cada fecha y hora y los formatos válidos en que se puedene especificar los valores.
Aquí hay un ejemplo que usa funciones de fecha. La siguiente
consulta selecciona todos los registros con un valor
date_col
dentro de los últimos 30 días:
mysql> SELECTsomething
FROMtbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <=date_col
;
Tenga en cuenta que la consulta también selecciona registros con fechas futuras.
Las funciones que esperan valores de fecha usualmente aceptan valores de fecha y hora e ignoran la parte de hora. Las funciones que esperan valores de hora usualmente aceptan valores de fecha y hora e ignoran la parte de fecha.
Las funciones que retornan la fecha u hora actuales se evalúan
sólo una vez por consulta al principio de la ejecución de
consulta. Esto significa que las referencias múltiples a una
función tales como NOW()
en una misma consulta
siempre producen el mismo resultado. Este principio también se
aplica a CURDATE()
,
CURTIME()
, UTC_DATE()
,
UTC_TIME()
, UTC_TIMESTAMP()
,
y a cualquiera de sus sinónimos.
En MySQL 5.0, las funciones
CURRENT_TIMESTAMP()
,
CURRENT_TIME()
,
CURRENT_DATE()
, y
FROM_UNIXTIME()
retornan valores en la zona
horaria de la conexión, que está disponible como valor de la
variable de sistema time_zone
. Además,
UNIX_TIMESTAMP()
asume que su argumento es un
valor de fecha y hora en la zona horaria actual. Consulte
Sección 5.9.8, “Soporte de zonas horarias en el servidor MySQL”.
Los rango de retorno en las siguientes descripciones de funciones
se aplican en fechas completas. Si la fecha es un valor
“cero” o una fecha incompleta como
'2001-11-00'
, las funciones que extraen una
parte de la fecha pueden retornar 0. Por ejemplo
DAYOFMONTH('2001-11-00')
retorna 0.
-
ADDDATE(
date
,INTERVALexpr
type
),ADDDATE(
expr
,days
)Cuando se invoca con la forma
INTERVAL
del segundo argumento,ADDDATE()
es sinónimo deDATE_ADD()
. La función relacionadaSUBDATE()
es sinónimo deDATE_SUB()
. Para información del argumentoINTERVAL
, consulte la discusión deDATE_ADD()
.mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02' mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02'
Si el argumento
days
es simplemente un valor entero, entonces MySQL 5.0 lo trata como el número de días a añadir aexpr
.mysql> SELECT ADDDATE('1998-01-02', 31); -> '1998-02-02'
-
ADDTIME(
expr
,expr2
)ADDTIME()
añadeexpr2
aexpr
y retorna el resultado.expr
es una expresión de fecha u hora y fecha, yexpr2
es una expresión temporal.mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999', -> '1 1:1:1.000002'); -> '1998-01-02 01:01:01.000001' mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); -> '03:00:01.999997'
-
CONVERT_TZ(
dt
,from_tz
,to_tz
)CONVERT_TZ()
convierte un valor datetimedt
de la zona horaria dada porfrom_tz
a la zona horaria dada porto_tz
y retorna el valor resultante. Las zonas horarias pueden especificarse como se describe en Sección 5.9.8, “Soporte de zonas horarias en el servidor MySQL”. Esta función retornaNULL
si los argumentos son inválidos.Si el valor se sale del rango soportado por el tipo
TIMESTAMP
al convertirse defrom_tz
a UTC, no se realiza ninguna conversión. El rangoTIMESTAMP
se describe en Sección 11.1.2, “Panorámica de tipos de fechas y hora”.mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); -> '2004-01-01 13:00:00' mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); -> '2004-01-01 22:00:00'
Nota: Para usar zonas horarias con nombres tales como
'MET'
o'Europe/Moscow'
, las tabas de zona horaria deben estar actualizadas correctamente. Consulte Sección 5.9.8, “Soporte de zonas horarias en el servidor MySQL” para instrucciones. -
CURDATE()
Retorna la fecha horaria como valor en formato
'YYYY-MM-DD'
oYYYYMMDD
, dependiendo de si la fucnión se usa en un contexto numérico o de cadena de carácteres.mysql> SELECT CURDATE(); -> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215
-
CURRENT_DATE
,CURRENT_DATE()
CURRENT_DATE
yCURRENT_DATE()
son sinónimos deCURDATE()
. -
CURTIME()
Retorna la hora actual como valor en formato
'HH:MM:SS'
oHHMMSS
dependiendo de si la fucnión se usa en un contexto numérico o de cadena de carácteres.mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026
-
CURRENT_TIME
,CURRENT_TIME()
CURRENT_TIME
yCURRENT_TIME()
son sinónimos deCURTIME()
. -
CURRENT_TIMESTAMP
,CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP()
son sinónimos deNOW()
. -
DATE(
expr
)Extrae la parte de fecha de la expresión de fecha o fecha y hora
expr
.mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
-
DATEDIFF(
expr
,expr2
)DATEDIFF()
retorna el número de días entre la fecha inicialexpr
y la fecha finalexpr2
.expr
yexpr2
son expresiones de fecha o de fecha y hora. Sólo las partes de fecha de los valores se usan en los cálculos.mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); -> 1 mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31'); -> -31
-
DATE_ADD(
date
,INTERVALexpr
type
),DATE_SUB(
date
,INTERVALexpr
type
)Estas funciones realizan operaciones aritméticas de fechas.
date
es un valorDATETIME
oDATE
especificando la fecha de inicio.expr
es una expresión que especifica el intervalo a añadir o borrar de la fecha de inicio.expr
es una cadena; puede comenzar con un '-
' para intervalos negativos.type
es una palabra clave que indica cómo debe interpretarse la expresión.La palabra clave
INTERVAL
y el especificadortype
no son sensibles a mayúsculas.La siguiente tabla muestra cómo se relacionan los argumentos
type
yexpr
:type
ValueExpected expr
FormatMICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
Los valores
QUARTER
yWEEK
están disponibles a partir de MySQL 5.0.0.MySQL permite cualquier delimitador en el formato
expr
. Los mostrados en la tabla son sugerencias. Si el argumentodate
es un valoraDATE
y sus cálculos involucarán sólo partesYEAR
,MONTH
, yDAY
(esto es, sin partes de hora), el resultado es un valorDATE
. De otro modo, el resultado es un valorDATETIME
.INTERVAL
expr
type
se permite en cualquier lado del operador+
si la expresión en el otro lado es una fecha o fecha y hora. Para el operador-
,INTERVAL
expr
type
se permite sólo en la parte derecha, ya que no tiene sentido restar una fecha de un intervalo. (Consulte los ejemplos a continuación.)mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND; -> '1998-01-01 00:00:00' mysql> SELECT INTERVAL 1 DAY + '1997-12-31'; -> '1998-01-01' mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND; -> '1997-12-31 23:59:59' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '1998-01-01 00:00:00' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL 1 DAY); -> '1998-01-01 23:59:59' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); -> '1998-01-01 00:01:00' mysql> SELECT DATE_SUB('1998-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '1997-12-30 22:58:59' mysql> SELECT DATE_ADD('1998-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR); -> '1997-12-30 14:00:00' mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'
Si especifica un intervalo demasiado pequeño (no incluye todas las partes de intervalo que se esperarían de la palabra clave
type
), MySQL asume que ha dejado la parte más a la izquierda del valor del intervalo. Por ejemplo, si especifica untype
deDAY_SECOND
, se espera que el valor deexpr
tenga días, horas, minutos y segundos. Si especifica un valor como '1:10', MySQL asume que las partes de día y hora no se encuentran disponibles y que el valor representa minutos y segundos. En otras palabras,'1:10' DAY_SECOND
se interpreta de forma que es equivalente a'1:10' MINUTE_SECOND
. Esto es análogo a la forma en que MySQL interpreta valoresTIME
como representando tiempo transcurrido en lugar de la hora del día.Si suma o borra de un valor de fecha algo que contenga una parte de fora, el resultado se convierte automáticamente a valor fecha/hora:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY); -> '1999-01-02' mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR); -> '1999-01-01 01:00:00'
Si usa fechas muy mal formadas, el resultado es
NULL
. Si sumaMONTH
,YEAR_MONTH
, oYEAR
y la fecha resultante tiene un día mayor que el día máximo para el nuevo mes, el día se ajusta al número máximo del nuevo mes:mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> '1998-02-28'
-
DATE_FORMAT(
date
,format
)Formatea el valor
date
según la cadenaformat
. Los siguientes especificadores pueden usarse en la cadenaformat
:Especificador Descripción %a
Día de semana abreviado ( Sun
..Sat
)%b
Mes abreviado ( Jan
..Dec
)%c
Mes, numérico ( 0
..12
)%D
Día del mes con sufijo inglés ( 0th
,1st
,2nd
,3rd
, ...)%d
Día del mes numérico ( 00
..31
)%e
Día del mes numérico ( 0
..31
)%f
Microsegundos ( 000000
..999999
)%H
Hora ( 00
..23
)%h
Hora ( 01
..12
)%I
Hora ( 01
..12
)%i
Minutos, numérico ( 00
..59
)%j
Día del año ( 001
..366
)%k
Hora ( 0
..23
)%l
Hora ( 1
..12
)%M
Nombre mes ( January
..December
)%m
Mes, numérico ( 00
..12
)%p
AM
oPM
%r
Hora, 12 horas ( hh:mm:ss
seguido deAM
oPM
)%S
Segundos ( 00
..59
)%s
Segundos ( 00
..59
)%T
Hora, 24 horas ( hh:mm:ss
)%U
Semana ( 00
..53
), donde domingo es el primer día de la semana%u
Semana ( 00
..53
), donde lunes es el primer día de la semana%V
Semana ( 01
..53
), donde domingo es el primer día de la semana; usado con%X
%v
Semana ( 01
..53
), donde lunes es el primer día de la semana; usado con%x
%W
Nombre día semana ( Sunday
..Saturday
)%w
Día de la semana ( 0
=Sunday..6
=Saturday)%X
Año para la semana donde domingo es el primer día de la semana, numérico, cuatro dígitos; usado con %V
%x
Año para la semana, donde lunes es el primer día de la semana, numérico, cuatro dígitos; usado con %v
%Y
Año, numérico, cuatro dígitos %y
Año, numérico (dos dígitos) %%
Carácter ' %
' literalTodos los otros carácteres se copian al resultado sin interpretación.
Tenga en cuenta que el carácter '
%
' se necesita antes de carácteres especificadores de formato.Los rangos para los especificadores de mes y día comienzan en cero debido a que MySQL permite almacenar fechas incompletas tales como
'2004-00-00'
.mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'
-
DAY(
date
)DAY()
es sinónimo deDAYOFMONTH()
. -
DAYNAME(
date
)Retorna el nombre del día de la semana para
date
.mysql> SELECT DAYNAME('1998-02-05'); -> 'Thursday'
-
DAYOFMONTH(
date
)Retorna el día del mes para
date
, en el rango1
a31
.mysql> SELECT DAYOFMONTH('1998-02-03'); -> 3
-
DAYOFWEEK(
date
)Retorna el índice del día de la semana para
date
(1 = lunes, 2 = martes, ..., 7 = sábado). Estos valores del índice se corresponden con el estándar ODBC.mysql> SELECT DAYOFWEEK('1998-02-03'); -> 3
-
DAYOFYEAR(
date
)Retorna el día del año para
date
, en el rango 1 a 366.mysql> SELECT DAYOFYEAR('1998-02-03'); -> 34
-
EXTRACT(
type
FROMdate
)La función
EXTRACT()
usa la misma clase de especificadores de tipo queDATE_ADD()
oDATE_SUB()
, pero extrae partes de la fecha en lugar de realizar aritmética de fecha.mysql> SELECT EXTRACT(YEAR FROM '1999-07-02'); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03'); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.00123'); -> 123
-
FROM_DAYS(
N
)Dado un número de día
N
, retorna un valorDATE
.mysql> SELECT FROM_DAYS(729669); -> '1997-10-07'
Use
FROM_DAYS()
con precaución en fechas viejas. No se pretende que se use con valores que precedan el calendario Gregoriano (1582). Consulte Sección 12.6, “Qué calendario utiliza MySQL”. -
FROM_UNIXTIME(
unix_timestamp
) ,FROM_UNIXTIME(
unix_timestamp
,format
)Retorna una representación del argumento
unix_timestamp
como un valor en formato'YYYY-MM-DD HH:MM:SS'
oYYYYMMDDHHMMSS
, dependiendo de si la función se usa en un formato numérico o de cadena de carácteres.mysql> SELECT FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300
Si se da
format
, el resultado se formatea según la cadenaformat
.format
puede contener los mismos especificadores que los listados en la entrada para la funciónDATE_FORMAT()
.mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> '%Y %D %M %h:%i:%s %x'); -> '2003 6th August 06:22:58 2003'
-
GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')
Retorna una cadena de formato. Esta función es útil en combinación con las funciones
DATE_FORMAT()
ySTR_TO_DATE()
.Los tres valores posibles para el primer argumento y los cinco posibles valores para el segundo argumento resultan en 15 posibles cadenas de formato (para los especificadores usados, consulte la tabla en la descripción de la función
DATE_FORMAT()
).LLamad a función Resultado GET_FORMAT(DATE,'USA')
'%m.%d.%Y'
GET_FORMAT(DATE,'JIS')
'%Y-%m-%d'
GET_FORMAT(DATE,'ISO')
'%Y-%m-%d'
GET_FORMAT(DATE,'EUR')
'%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL')
'%Y%m%d'
GET_FORMAT(DATETIME,'USA')
'%Y-%m-%d-%H.%i.%s'
GET_FORMAT(DATETIME,'JIS')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR')
'%Y-%m-%d-%H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL')
'%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA')
'%h:%i:%s %p'
GET_FORMAT(TIME,'JIS')
'%H:%i:%s'
GET_FORMAT(TIME,'ISO')
'%H:%i:%s'
GET_FORMAT(TIME,'EUR')
'%H.%i.%S'
GET_FORMAT(TIME,'INTERNAL')
'%H%i%s'
El formato ISO es ISO 9075, no ISO 8601.
En MySQL 5.0,
TIMESTAMP
puede usarse;GET_FORMAT()
retorna los mismos valores que paraDATETIME
.mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2003' mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')); -> '2003-10-31'
Consulte Sección 13.5.3, “Sintaxis de
SET
”. -
HOUR(
time
)Retorna la hora para
time
. El rango del valor de retorno es 0 a 23 para valores de horas del día.mysql> SELECT HOUR('10:05:03'); -> 10
Además, el rango de los valores
TIME
es mucho mayor, así queHOUR
puede retornar valores mayores que23
.mysql> SELECT HOUR('272:59:59'); -> 272
-
LAST_DAY(
date
)Toma una fecha o fecha/hora y retorna el valor correspondiente para el último día del mes. Retorna
NULL
si el argumento es inválido.mysql> SELECT LAST_DAY('2003-02-05'); -> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
-
LOCALTIME
,LOCALTIME()
LOCALTIME
yLOCALTIME()
son sinónimos deNOW()
. -
LOCALTIMESTAMP
,LOCALTIMESTAMP()
LOCALTIMESTAMP
yLOCALTIMESTAMP()
son sinónimos deNOW()
. -
MAKEDATE(
year
,dayofyear
)Retorna una fecha, dado un año y día del año.
dayofyear
debe ser mayor a 0 o el resultado esNULL
.mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); -> '2001-01-31', '2001-02-01' mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365); -> '2001-12-31', '2004-12-30' mysql> SELECT MAKEDATE(2001,0); -> NULL
-
MAKETIME(
hour
,minute
,second
)Retorna un valor horario calculado a partir de los argumentos
hour
,minute
, ysecond
.mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
-
MICROSECOND(
expr
)Retorna los microsegundos a partir del a expresión de hora o fecha/hora
expr
como número en el rango de0
a999999
.mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010'); -> 10
-
MINUTE(
time
)Retorna el minuto de
time
, en el rango0
a59
.mysql> SELECT MINUTE('98-02-03 10:05:03'); -> 5
-
MONTH(
date
)Retorna el mes para
date
, en el rango1
a12
.mysql> SELECT MONTH('1998-02-03'); -> 2
-
MONTHNAME(
date
)Retorna el nombre completo del mes para
date
.mysql> SELECT MONTHNAME('1998-02-05'); -> 'February'
-
NOW()
Retorna la fecha y hora actual como valor en formato
'YYYY-MM-DD HH:MM:SS'
oYYYYMMDDHHMMSS
, dependiendo de si la función se usa en contexto numérico o de cadena de carácteres.mysql> SELECT NOW(); -> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026
-
PERIOD_ADD(
P
,N
)Añade
N
meses al periodoP
(en el formatoYYMM
oYYYYMM
). Retorna un valor en el formatoYYYYMM
. Tenga en cuenta que el argumento del periodoP
no es una fecha.mysql> SELECT PERIOD_ADD(9801,2); -> 199803
-
PERIOD_DIFF(
P1
,P2
)Retorna el número de meses entre periodos
P1
yP2
.P1
yP2
deben estar en el formatoYYMM
oYYYYMM
. Tenga en cuenta que los argumentos del periodoP1
yP2
no son fechas.mysql> SELECT PERIOD_DIFF(9802,199703); -> 11
-
QUARTER(
date
)Retorna el cuarto del año para
date
, en el rango1
a4
.mysql> SELECT QUARTER('98-04-01'); -> 2
-
SECOND(
time
)Retorna el segundo para
time
, en el rango0
a59
.mysql> SELECT SECOND('10:05:03'); -> 3
-
SEC_TO_TIME(
seconds
)Retorna el argumento
seconds
, convertido a horas, minutos y segundos, como un valor en formato'HH:MM:SS'
oHHMMSS
, dependiendo de si la función se usa en contexto numérico o de cadena de carácteres.mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
-
STR_TO_DATE(
str
,format
) -
Esta es la inversa de la función
DATE_FORMAT()
. Toma la cadenastr
y la cadena de formatoformat
.STR_TO_DATE()
retorna un valorDATETIME
si la cadena de formato contiene parte de fecha y hora, o un valorDATE
oTIME
si la cadena contiene sólo parte de fecha o hora.Los valores fecha, hora o fecha/hora contenidos en
str
deben ser dados en el formato indicado porformat
. Para los especificadores que pueden usarse enformat
, consulte la tabla en la descripción de la funciónDATE_FORMAT()
. Todos los otros carácteres no se interpretan. Sistr
contiene un valor fecha, hora o fecha/hora ilegal,STR_TO_DATE()
retornaNULL
. A partir de MySQL 5.0.3, un valor ilegal también produce una advertencia.mysql> SELECT STR_TO_DATE('03.10.2003 09.20','%d.%m.%Y %H.%i'); -> '2003-10-03 09:20:00' mysql> SELECT STR_TO_DATE('10arp', '%carp'); -> '0000-10-00 00:00:00' mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00','%Y-%m-%d %H:%i:%s'); -> NULL
El chequeo de rango en las partes de los valores de fecha se describe en Sección 11.3.1, “Los tipos de datos
DATETIME
,DATE
yTIMESTAMP
”. Esto significa, por ejemplo, que una fecha con una parte de día mayor que el número de días en un mes se permite mientras la parte del día esté en el rango de 1 a 31. También, fechas “cero” o fechas con partes de 0 se permiten.mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31'
-
SUBDATE(
date
,INTERVALexpr
type
),SUBDATE(
expr
,days
)Cuando se invoca con la forma
INTERVAL
del segundo argumento,SUBDATE()
es sinónimo deDATE_SUB()
. Para información del argumentoINTERVAL
, consulte la discusión paraDATE_ADD()
.mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02'
La siguiente forma permite el uso de un valor entero para
days
. En tales casos, es el número de días a ser borrados de la expresión fecha o fecha/horaexpr
.mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31); -> '1997-12-02 12:00:00'
Nota no puede usar formato
"%X%V"
para convertir una cadena año-semana en fecha ya que la combinación de un año y semana no identific unívocamente un año y semana si la semana atraviesa la forntera de un mes. Para convertir un año-semana a fecha, debe especificar el día de la semana:mysql> select str_to_date('200442 Monday', '%X%V %W'); -> 2004-10-18
-
SUBTIME(
expr
,expr2
)SUBTIME()
restaexpr2
deexpr
y retorna el resultado.expr
es una expresión de hora o fecha/hora, yexpr2
es una expresión de hora.mysql> SELECT SUBTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002'); -> '1997-12-30 22:58:58.999997' mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); -> '-00:59:59.999999'
-
SYSDATE()
SYSDATE()
es sinónimo deNOW()
. -
TIME(
expr
)Extrae la parte de hora de la expresión hora o fecha/hora
expr
.mysql> SELECT TIME('2003-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123'
-
TIMEDIFF(
expr
,expr2
)TIMEDIFF()
retorna el tiempo entre la hora de inicioexpr
y la hora finalexpr2
.expr
yexpr2
son expresiones de hora o de fecha/hora, pero ambas deben ser del mismo tipo.mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', -> '2000:01:01 00:00:00.000001'); -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001', -> '1997-12-30 01:01:01.000002'); -> '46:58:57.999999'
-
TIMESTAMP(
expr
) ,TIMESTAMP(
expr
,expr2
)Con un único argumento, esta función retorna la expresión de fecha o fecha/hora
expr
como valor fecha/hora. Con dos argumentos, suma la expresión de horaexpr2
a la expresión de fecha o de fecha/horaexpr
y retorna el resultado como valor fecha/hora.mysql> SELECT TIMESTAMP('2003-12-31'); -> '2003-12-31 00:00:00' mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); -> '2004-01-01 00:00:00'
-
TIMESTAMPADD(
interval
,int_expr
,datetime_expr
)Suma la expresión entera
int_expr
a la expresión de fecha o de fecha/horadatetime_expr
. La unidad forint_expr
la da el argumentointerval
, que debe ser uno de los siguientes valores:FRAC_SECOND
,SECOND
,MINUTE
,HOUR
,DAY
,WEEK
,MONTH
,QUARTER
, oYEAR
.El valor
interval
puede especificarse usando una de las palabras claves que se muestran, o con un prefijo deSQL_TSI_
. Por ejemplo,DAY
oSQL_TSI_DAY
son legales.mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); -> '2003-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); -> '2003-01-09'
TIMESTAMPADD()
está disponible desde MySQL 5.0.0. -
TIMESTAMPDIFF(
interval
,datetime_expr1
,datetime_expr2
)Retorna la diferencia entera entre las expresiones de fecha o de fecha/hora
datetime_expr1
ydatetime_expr2
. La unidad del resultado se da en el argumentointerval
. Los valores legales parainterval
son los mismos que los listados en la descripción de la funciónTIMESTAMPADD()
.mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1
TIMESTAMPDIFF()
está disponible desde MySQL 5.0.0. -
TIME_FORMAT(
time
,format
)Se usa como la función
DATE_FORMAT()
pero la cadenaformat
puede contener sólo los especificadores de formato que tratan horas, minutos y segundos. Otros especificadores producen un valorNULL
o0
.Si el valor
time
contiene una parte horaria mayor que23
, los especificadores de formato horario%H
y%k
producen un valor mayor que el rango usual de0..23
. Los otros especificadores de hora producen la hora modulo 12.mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
-
TIME_TO_SEC(
time
)Retorna el argumento
time
convertido en segundos.mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
-
TO_DAYS(
date
)Dada la fecha
date
, retorna un número de día (el número de dias desde el año 0).mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
TO_DAYS()
no está pensado para usarse con valores anteriores al calendario Gregoriano (1582), ya que no tiene en cuenta los días perdidos cuando se cambió el calendario. Consulte Sección 12.6, “Qué calendario utiliza MySQL”.Recuerde que MySQL convierte años de dos dígitos en fechas de cuatro dígitos usando las reglas en Sección 11.3, “Tipos de fecha y hora”. Por ejemplo,
'1997-10-07'
y'97-10-07'
se consideran fechas idénticas:mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07'); -> 729669, 729669
Para fechas anteriores a 1582 (y posiblemente un año posterior en otras localizaciones), los resultados de esta función no son fiables. Consulte Sección 12.6, “Qué calendario utiliza MySQL” para más detalles.
-
UNIX_TIMESTAMP()
,UNIX_TIMESTAMP(
date
)Si se llama sin argumentos, retorna el timestamp de Unix (segundos desde
'1970-01-01 00:00:00'
GMT) como entero sin signo. Si se llama aUNIX_TIMESTAMP()
con un argumentodate
, retorna el valor del argumento como segundos desde'1970-01-01 00:00:00'
GMT.date
puede ser una cadenaDATE
, una cadenaDATETIME
, unTIMESTAMP
, o un número en el formatoYYMMDD
oYYYYMMDD
en hora local.mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
Cuando se usa
UNIX_TIMESTAMP
en una columnaTIMESTAMP
, la función retorna el valor del timestamp interno directamente, sin conversión implícita “string-to-Unix-timestamp” . Si pasa una fecha fuera de rango aUNIX_TIMESTAMP()
, retorna0
, pero tenga en cuenta que sólo se hace un chequeo de rango básico (año de1970
a2037
, mes de01
a12
, día de01
a31
).Si quiere restar columnas
UNIX_TIMESTAMP()
puede querer convertir el resultado a enteros sin signo. Consulte Sección 12.8, “Funciones y operadores de cast”. -
UTC_DATE
,UTC_DATE()
Retorna la fecha UTC actual como valor en formato
'YYYY-MM-DD'
oYYYYMMDD
, dependiendo si la función se usa en un contexto numérico o de cadenas de carácteres.mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
-
UTC_TIME
,UTC_TIME()
Retorna la hora UTC actual como valor en formato
'HH:MM:SS'
orHHMMSS
dependiendo si la función se usa en un contexto numérico o de cadenas de carácteres.mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753
-
UTC_TIMESTAMP
,UTC_TIMESTAMP()
Retorna la fecha y hora UTC actual como valor en formato
'YYYY-MM-DD HH:MM:SS'
oYYYYMMDDHHMMSS
dependiendo si la función se usa en un contexto numérico o de cadenas de carácteres.mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804
-
WEEK(
date
[,mode
])Esta función retorna el número de semana para
date
. La forma de dos argumentos deWEEK()
le permite especificar si la semana comienza en lunes o domingo y si el valor de retorno debe estar en el rango de0
a53
o de1
a53
. Si el argumentomode
se omite en MySQL 5.0, el valor de la variable de sistemadefault_week_format
se usa. Consulte Sección 5.3.3, “Variables de sistema del servidor”.La siguiente tabla describe cómo funciona el argumento
mode
:Primer día Modo de semana Rango Semana 1 es la primera semana... 0 Domingo 0-53 con un domingo en este año 1 Lunes 0-53 con más de 3 días este año 2 Domingo 1-53 con un domingo este año 3 Lunes 1-53 con más de 3 días este año 4 Domingo 0-53 con más de 3 días este año 5 Lunes 0-53 con un lunes en este año 6 Domingo 1-53 con más de 3 días este año 7 Lunes 1-53 con un lunes en este año mysql> SELECT WEEK('1998-02-20'); -> 7 mysql> SELECT WEEK('1998-02-20',0); -> 7 mysql> SELECT WEEK('1998-02-20',1); -> 8 mysql> SELECT WEEK('1998-12-31',1); -> 53
Tenga en cuenta que si una fecha cae en la última semana del año prévio, MySQL retorna
0
si no usa2
,3
,6
, o7
con el argumento opcionalmode
:mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
Se podría argumentar que MySQL debería retornar
52
para la funciónWEEK()
, ya que la fecha dada ocurre en la 52a semana de 1999. Decidimos retornar0
en su lugar porque queríamos que la función devolviera “el número de semana en el año dado.” Esta hace uso de la funciónWEEK()
fiable combinada con otras funciones que extraen una parte de fecha de una fecha.Si prefiere que el resultado a ser evaluado respecto al año que contiene el primer día de la semana para la fecha dada, debe usar
0
,2
,5
, o7
como el argumentomode
opcional.mysql> SELECT WEEK('2000-01-01',2); -> 52
Alternativamente, use la función
YEARWEEK()
:mysql> SELECT YEARWEEK('2000-01-01'); -> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'
-
WEEKDAY(
date
)Retorna el índice de días de la semana para
date
(0
= lunes,1
= martes, ...6
= domingo).mysql> SELECT WEEKDAY('1998-02-03 22:23:00'); -> 1 mysql> SELECT WEEKDAY('1997-11-05'); -> 2
-
WEEKOFYEAR(
date
)Retorna la semana de la fecha como número del rango
1
a53
. Esta es una función de compatibilidad equivalente aWEEK(
date
,3).mysql> SELECT WEEKOFYEAR('1998-02-20'); -> 8
-
YEAR(
date
)Retorna el año para
date
, en el rango1000
a9999
.mysql> SELECT YEAR('98-02-03'); -> 1998
-
YEARWEEK(
date
),YEARWEEK(
date
,start
)Retorna año y semana para una fecha. El argumento
start
funciona exactamente como el argumentostart
deWEEK()
. El año en el resultado puede ser diferente del año en el argumento fecha para la primera y última semana del año.mysql> SELECT YEARWEEK('1987-01-01'); -> 198653
Tenga en cuenta que el número de semana es diferente de lo que la función
WEEK()
retornaría (0
) para argumentos opcionales0
o1
, comoWEEK()
retorna la semana en el contexto del año dado.