Funciones de fecha y tiempo

Funciones de fecha y hora

El conjunto de funciones que ofrece cada producto —MySQL, SQL Server, Oracle Database, etc.— suele ser particular de cada uno aunque, al final, ofrezcan más o menos la misma operativa. Esto es más evidente en las funciones de fecha y hora, muy dependientes de cómo se gestiona el almacenamiento de este tipo de datos en cada marca de servidor de base de datos. También es cierto que, aparte de cambios mínimos en los nombres y los parámetros de las funciones —y algo menos en los formatos—, cada vez se está consensuando más un núcleo de funciones estándar.

En el manual de referencia de MySQL puede consultarse la lista completa de funciones para el manejo del tiempo. Aquí solo expondremos algunas:

now(), curdate(), curtime()
date_format(), str_to_date()
day(), dayofweek(), dayname(), month(), year(), hour(), minute(), second() 

Ahora

La función now() devuelve la fecha y hora del servidor en formato datetime. Curdate() y curtime() hacen lo mismo pero con la fecha y la hora respectivamente.

select now(), curdate(), curtime(); 

Formato

Se trata de mostrar o transformar el formato de la fecha. Las funciones principales de formato podemos decir que son

  • date_format()
  • str_to_date()

Una es la inversa de la otra: dateformat() transforma la fecha a un formato de texto determinado y str_to_date() una cadena de caracteres en un formato concreto a fecha. Las dos trabajan con 2 parámetros, una expresión y una cadena de formato. La cadena de formato indica a la función que aspecto tiene o queremos que tenga (depende de si es una u otra función) el dato que le suministramos en el primer parámetro:

Profesores, con la fecha de ingreso en formato "dd/mm/aaaa".

select dni, nombre, date_format(ingreso, '%d/%m/%Y') ingreso 
from profesores; 

Date_format() transforma el formato nativo de MySQL al que nosotros le pidamos. En este caso le estamos pidiendo que nos muestre la fecha de ingreso en el formato "día/mes/año con cuatro cifras". Los códigos que se pueden utilizar en estas cadenas de formato —como %d, %m o %Y se pueden consultar igualmente en el manual de MySQL.

En este caso hacemos todo lo contrario, acomodamos la constante de fecha para que MySQL la pueda entender:

Profesores que han ingresado antes de 1/1/1990.

select * 
from profesores
where ingreso < str_to_date('1/1/90','%d/%m/%y'); 

Por la razón que sea —piénsese en un programa de ordenador que esté accediendo al servidor— la fecha que debemos consultar está en un formato especial, "día/mes/año con 2 cifras". El primer parámetro es la fecha, y el segundo el formato en el que MySQL debe leer la anterior. De esta forma, MySQL sabe cómo transformarla a su formato nativo, '1990-01-01', y comparar con las almacenadas en la tabla.

Así, la cadena de formato para la primera consulta representa "cómo queremos la salida" y la de la segunda "cómo está escrita la fecha que quiero comparar".

Extracción

Las otras funciones a las que vamos a prestar atención son las que extraen parte de la expresión temporal. En todos estos ejemplos vamos a trabajar con el día, el més o el año de las fechas, y con varios tipos de información posible.

Día del mes, mes, y año de la fecha de ingreso de las profesoras llamadas 'Eva Gómez'.

select day(ingreso) día, month(ingreso) mes, year(ingreso) año 
from profesores
where nombre='EVA GOMEZ'; 

Día de la semana, mes, y nombre del mes de la fecha de ingreso de las profesoras llamadas 'Eva Gómez'.

select dayname(ingreso) d, dayofweek(ingreso) nd, monthname(ingreso) m 
from profesores
where nombre='EVA GOMEZ'; 

Fecha y hora del sistema, con formato "añomesdía -- hora:minutos:segundos"

select date_format(now(),'%Y%m%d -- %H:%i:%s') ahora; 

Evidentemente, se pueden hacer muchas más cosas con fechas y tiempos —diferencia en días entre dos fechas, por ejemplo—. Tan solo hay que acudir al manual de MySQL o a los muchos ejemplos que se pueden encontrar en una simple búsqueda.