🎯 Quedan pocos días este mes Apoya SQLTest.online y ayúdanos a mantener la práctica de SQL gratuita para todos. Dona hoy →
Código SQL copiado al portapapeles

Funciones de fecha y hora en SQL

Lección 3.4 · Tiempo de lectura: ~8 min · Tareas de práctica ↓

Las funciones de fecha y hora en SQL devuelven la fecha actual, extraen partes de una fecha, suman y restan intervalos, calculan la diferencia entre fechas y dan formato a las fechas para mostrarlas. En esta lección aprenderás las funciones más usadas con ejemplos sobre los datos de alquiler de la base Sakila y verás cómo cambian sus nombres entre bases de datos.

Casi todas las tablas de negocio tienen fechas: cuándo se hizo un pedido, cuándo se alquiló una película, cuándo se realizó un pago. Preguntas como "¿cuánto duró el alquiler?", "¿cuándo hay que devolver la película?" o "¿cuántos alquileres hubo en julio?" se responden con funciones de fecha.

Los ejemplos usan la sintaxis de MySQL y MariaDB. Las funciones de fecha varían entre bases de datos más que cualquier otro grupo, así que al final de la lección hay una tabla comparativa.

Funciones de fecha y hora en SQL: extraer el año, el mes y el día de una fecha, sumar un intervalo con DATE_ADD y DATEDIFF entre dos fechas

La fecha y la hora actuales

ExpresiónDevuelveEjemplo
CURRENT_DATELa fecha actual2026-10-16
CURRENT_TIMELa hora actual14:25:30
CURRENT_TIMESTAMP o NOW()La fecha y la hora actuales2026-10-16 14:25:30
SELECT CURRENT_DATE AS today,
       CURRENT_TIME AS now_time,
       NOW() AS now_datetime;

Resultado: una fila con la fecha, la hora y la fecha con hora actuales del servidor de base de datos.

CURRENT_DATE, CURRENT_TIME y CURRENT_TIMESTAMP se escriben sin paréntesis: son expresiones del estándar SQL. El valor se fija al inicio de la sentencia, así que todas las filas de una misma consulta reciben la misma hora.


Extraer partes de una fecha

DATE() y TIME() separan un valor de fecha y hora en fecha y hora; YEAR(), MONTH() y DAY() devuelven números:

SELECT rental_date,
       DATE(rental_date) AS rental_day,
       TIME(rental_date) AS rental_time,
       YEAR(rental_date) AS rental_year,
       MONTH(rental_date) AS rental_month,
       DAY(rental_date) AS day_of_month
FROM rental
LIMIT 3;

Resultado: para cada uno de los tres primeros alquileres, la fecha y hora completa separada en fecha, hora, año, mes y día.

La función estándar EXTRACT() hace lo mismo y funciona en la mayoría de las bases de datos:

SELECT rental_date,
       EXTRACT(YEAR FROM rental_date) AS rental_year,
       EXTRACT(MONTH FROM rental_date) AS rental_month
FROM rental
LIMIT 3;

Las partes extraídas son útiles en los filtros:

SELECT rental_id, rental_date
FROM rental
WHERE YEAR(rental_date) = 2005
  AND MONTH(rental_date) = 7
LIMIT 5;

Resultado: cinco alquileres hechos en julio de 2005.

Una función aplicada a una columna impide que la base de datos use un índice sobre ella. En tablas grandes, un rango de fechas es más rápido: WHERE rental_date >= '2005-07-01' AND rental_date < '2005-08-01'. Verás por qué en las lecciones sobre índices.


Sumar y restar intervalos

DATE_ADD() y DATE_SUB() desplazan una fecha según un intervalo. La unidad puede ser SECOND, MINUTE, HOUR, DAY, WEEK, MONTH o YEAR.

SELECT rental_id,
       rental_date,
       DATE_ADD(rental_date, INTERVAL 7 DAY) AS due_date,
       DATE_SUB(rental_date, INTERVAL 1 MONTH) AS month_before
FROM rental
LIMIT 3;

Resultado: la fecha de cada alquiler, la fecha siete días después y la fecha un mes antes.

MySQL y MariaDB también aceptan la forma corta rental_date + INTERVAL 7 DAY.


La diferencia entre dos fechas

DATEDIFF(end, start) devuelve la cantidad de días entre dos fechas e ignora la hora:

SELECT rental_id,
       rental_date,
       return_date,
       DATEDIFF(return_date, rental_date) AS days_rented
FROM rental
WHERE return_date IS NOT NULL
LIMIT 5;

Resultado: cuántos días de calendario duró cada uno de cinco alquileres devueltos.

TIMESTAMPDIFF(unit, start, end) cuenta unidades completas de cualquier tamaño; fíjate en que la fecha inicial va primero:

SELECT rental_id,
       TIMESTAMPDIFF(HOUR, rental_date, return_date) AS hours_rented,
       TIMESTAMPDIFF(DAY, rental_date, return_date) AS full_days_rented
FROM rental
WHERE return_date IS NOT NULL
LIMIT 5;

Resultado: la duración del alquiler en horas y en días completos de 24 horas. full_days_rented puede ser menor que DATEDIFF, que cuenta días de calendario.


Dar formato a las fechas

DATE_FORMAT(date, format) convierte una fecha en texto con el formato indicado:

SELECT rental_date,
       DATE_FORMAT(rental_date, '%d.%m.%Y') AS european_date,
       DATE_FORMAT(rental_date, '%M %e, %Y %H:%i') AS long_date
FROM rental
LIMIT 3;

Resultado: la fecha como 24.05.2005 y como May 24, 2005 22:53.

EspecificadorSignificadoEjemplo
%YAño de 4 dígitos2005
%mMes de 2 dígitos05
%MNombre del mesMay
%d / %eDía con / sin cero inicial04 / 4
%H, %i, %sHoras (24 h), minutos, segundos22, 53, 30

El resultado de DATE_FORMAT() es texto, no una fecha. Da formato a las fechas solo para mostrarlas; compara y ordena los valores de fecha originales.


Funciones de fecha en otras bases de datos

TareaMySQL / MariaDBPostgreSQLSQL ServerSQLite
Fecha y hora actualesNOW()NOW()GETDATE()datetime('now')
Año de una fechaYEAR(d)EXTRACT(YEAR FROM d)YEAR(d)strftime('%Y', d)
Sumar 7 díasDATE_ADD(d, INTERVAL 7 DAY)d + INTERVAL '7 days'DATEADD(day, 7, d)date(d, '+7 days')
Días entre fechasDATEDIFF(d2, d1)d2::date - d1::dateDATEDIFF(day, d1, d2)julianday(d2) - julianday(d1)
Dar formato a una fechaDATE_FORMAT(d, '%d.%m.%Y')TO_CHAR(d, 'DD.MM.YYYY')FORMAT(d, 'dd.MM.yyyy')strftime('%d.%m.%Y', d)

EXTRACT(part FROM date) y CURRENT_DATE / CURRENT_TIMESTAMP son estándar y funcionan casi en todas partes.


Conclusiones clave:

  • CURRENT_DATE, CURRENT_TIMESTAMP y NOW() devuelven la fecha y la hora actuales.
  • DATE(), YEAR(), MONTH(), DAY() y EXTRACT() extraen partes de una fecha.
  • DATE_ADD() y DATE_SUB() desplazan una fecha según un intervalo.
  • DATEDIFF() cuenta días de calendario; TIMESTAMPDIFF() cuenta unidades completas de cualquier tamaño.
  • DATE_FORMAT() devuelve texto: úsalo para mostrar, no para comparar.
  • Los nombres de las funciones de fecha cambian mucho entre bases de datos; consulta la tabla anterior al cambiar de base.

Preguntas frecuentes

¿Cómo obtengo la fecha actual en SQL?

Usa CURRENT_DATE para la fecha sola, y CURRENT_TIMESTAMP o NOW() para la fecha con hora. En SQL Server, usa GETDATE() o CAST(GETDATE() AS DATE).

¿Cómo calculo la cantidad de días entre dos fechas en SQL?

En MySQL y MariaDB, usa DATEDIFF(end_date, start_date). En SQL Server, DATEDIFF(day, start_date, end_date). En PostgreSQL, resta una fecha de la otra: end_date::date - start_date::date.

¿Cómo sumo días a una fecha en SQL?

En MySQL y MariaDB, usa DATE_ADD(date, INTERVAL 7 DAY) o date + INTERVAL 7 DAY. En PostgreSQL, date + INTERVAL '7 days'; en SQL Server, DATEADD(day, 7, date).

Intenta resolver las siguientes tareas para reforzar lo que aprendiste en esta lección.

  1. Mes con Mayor Cantidad de Pagos
  2. Analizar datos de alquiler de películas
  3. Duración Promedio de Actividad del Cliente
  4. Contar Retrasos en Alquiler
  5. Distribución de Clientes por Día de la Semana