Trabajar con fechas / horas

Categories:

Otro tipo de dato con el que es frecuente interactuar son las horas y / o fechas. Para eso podemos utilizar distintas funciones de MySQL.

NOW
Muestra la hora y fecha en la que se ejecutó la función.

SELECT NOW();

-- NOW tiene algunos sinónimos: 
-- CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()
-- LOCALTIME, LOCALTIME()
-- LOCALTIMESTAMP, LOCALTIMESTAMP()

SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, LOCALTIMESTAMP(), NOW();

CURDATE
Muestra la fecha actual *

SELECT  CURDATE();

-- CURRENT_DATE y CURRENT_DATE()
-- son sinónimos de CURDATE()

SELECT CURDATE(), CURRENT_DATE, CURRENT_DATE();

CURTIME
Muestra la hora actual *

SELECT  CURTIME();

-- CURRENT_TIME, CURRENT_TIME()
-- son sinónimos de CURTIME()

SELECT CURTIME(), CURRENT_TIME, CURRENT_TIME();

* Actual se refiere a la hora y fecha en el equipo en el que está instalado MySQL.

DATE
Con DATE podemos obtener el valor de una fecha – la parte que corresponde a la fecha – de una expresión o de una fecha.

SELECT DATE("2015-01-01 02:25:22");

SELECT nombre,  DATE(creado) FROM roles;

DATEDIFF
Calcula el número de días entre dos fechas.
Si la primer fecha es anterior a la segunda fecha el valor que se devuelve es negativo – “fue hace x días ” -. Si la primer fecha es posterior a la segunda fecha el valor que se devuelve es positivo – “va a ser en x días ” -.

-- Primer fecha anterior a la fecha actual
SELECT  DATEDIFF("2015-01-01", CURDATE());  
-- -221

-- Fecha actual es superior a la fecha especificada
SELECT  DATEDIFF(CURDATE(), "2015-01-01");
-- 221

-- Se utiliza DATEDIFF para conocer la diferencia 
-- en días entre la fecha de creación  / actualización
-- de los roles. 
SELECT nombre, creado, actualizado, DATEDIFF(creado, actualizado) FROM roles;

TIME
De manera similar a DATE(), con TIME podemos obtener el valor de la hora de una fecha o de una expresión de hora / fecha.

SELECT TIME("2010-01-01 13:52:23");
SELECT nombre, TIME(creado) FROM roles;

TIMEDIFF
Calcula el número de horas entre dos fechas / horas. Al igual que datediff, si el primer valor es anterior al segundo valor, el valor que se obtiene es negativo – “fue hace x horas ” -. Si el primer valor es posterior al segundo, el valor que se obtiene es positivo – “va a ser en x horas ” -.

SELECT TIMEDIFF("2014-09-25 22:00:00", "2014-09-25 18:00:00");
SELECT TIMEDIFF("22:00:00", "18:00:00");
SELECT nombre, creado, actualizado, TIMEDIFF(creado, actualizado) FROM roles;

-- El valor máximo de TIMEDIFF es aproximadamente de 1 mes + 5 días
SELECT TIMEDIFF('2015-01-01 00:00:00','2015-02-05 00:00:00');

Nota:
El valor máximo que devuelve TIMEDIFF es 838:59:59 / -838:59:59 (que sería un poco más de un mes aprox).

DATEFORMAT
Da formato a una fecha / hora. Utiliza una cadena de texto donde se pueden especificar diferentes combinaciones de caracteres para especificar como va a ser el formato.

SELECT  DATE_FORMAT(NOW(), "%a %d %b %Y %T");
SELECT  DATE_FORMAT(NOW(), "%d-%m-%Y %T");

SELECT nombre, DATE_FORMAT(creado, "%a %d %b %Y %T") FROM roles;

* http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

YEAR, MONTH, DAY, HOUR, MINUTE, SECOND
Sirven para seleccionar el año, mes, día, hora, minuto o segundo – respectivamente – del valor asignado como parámetro.

SELECT titulo, creado, YEAR(creado), MONTH(creado), DAY(creado), HOUR(creado), MINUTE(creado), SECOND(creado) FROM publicaciones;

Existen más funciones para trabajar con horas y fechas en MySQL.
Las mencionadas son suficientes para lo que vamos a hacer cuando lleguemos a PHP.