Fechas · partes de una fecha

EXTRACT

Obtén año, mes, día u otra parte temporal sin tratar una fecha como texto y reconoce cuándo el dialecto exige otra función.

Lectura: 6–8 minVariantes por motorPráctica comprobada
Contenido de esta guía

Qué hace EXTRACT

EXTRACT obtiene una parte concreta de un valor temporal, por ejemplo el año o el mes. Es preferible a cortar una fecha como texto porque expresa la intención temporal de la consulta y deja que el motor trabaje con el tipo de fecha.

La forma EXTRACT(campo FROM valor_temporal) está disponible en PostgreSQL y MySQL. SQL Server utiliza habitualmente DATEPART y SQLite ofrece funciones como strftime() para resolver la misma necesidad.

Sintaxis en PostgreSQL y MySQL

SQL
SELECT EXTRACT(YEAR FROM fecha_pedido) AS anio,
       EXTRACT(MONTH FROM fecha_pedido) AS mes
FROM pedidos;

Los campos admitidos no son idénticos en todos los motores. Antes de usar unidades menos habituales, comprueba la documentación del dialecto.

Ejemplo guiado: obtener el año

Pedidos de ejemplo
idfecha_pedido
12025-12-20
22026-01-12
32026-07-03
42026-08-01
PostgreSQL / MySQL
SELECT id,
       EXTRACT(YEAR FROM fecha_pedido) AS anio
FROM pedidos
ORDER BY id;

El resultado lógico es 2025 para el pedido 1 y 2026 para los pedidos 2, 3 y 4. El tipo exacto devuelto por la función puede variar entre motores.

Alternativa equivalente en SQLite

SQLite no implementa la misma llamada EXTRACT(... FROM ...). Para una fecha ISO, strftime() puede obtener el año y después puedes convertirlo a número si lo necesitas.

SQLite
SELECT id,
       CAST(strftime('%Y', fecha_pedido) AS INTEGER) AS anio
FROM pedidos
ORDER BY id;
Resultado comprobado en SQLite
idanio
12025
22026
32026
42026

Agrupar por una parte de la fecha

Extraer una parte temporal suele ser útil para resumir datos. En PostgreSQL o MySQL podrías contar pedidos por año:

PostgreSQL / MySQL
SELECT EXTRACT(YEAR FROM fecha_pedido) AS anio,
       COUNT(*) AS pedidos
FROM pedidos
GROUP BY EXTRACT(YEAR FROM fecha_pedido)
ORDER BY anio;

Con los datos del ejemplo obtendrías un pedido en 2025 y tres en 2026.

Errores frecuentes

!
Copiar EXTRACT en SQLite o DATEPART en PostgreSQL

La intención es la misma, pero la función cambia. Separa el concepto general de la sintaxis específica del motor.

!
Cortar YYYY-MM-DD con SUBSTRING como regla general

Puede funcionar con un formato textual concreto, pero pierde semántica temporal y se rompe si cambia el tipo o formato.

Práctica: cuenta pedidos por año en SQLite

Intermedia · fecha + agregación

Resume los cuatro pedidos del ejemplo

Devuelve anio y pedidos. Convierte el año a entero, agrupa y ordena de menor a mayor.

Pista 1

Usa strftime('%Y', fecha_pedido).

Pista 2

La expresión usada para obtener el año debe participar también en la agrupación.

Ver solución explicada
SELECT CAST(strftime('%Y', fecha_pedido) AS INTEGER) AS anio,
       COUNT(*) AS pedidos
FROM pedidos
GROUP BY CAST(strftime('%Y', fecha_pedido) AS INTEGER)
ORDER BY anio;

La expresión transforma cada fecha en su año; GROUP BY reúne después las filas con el mismo valor.

Compatibilidad entre motores

PostgreSQL y MySQL documentan EXTRACT. SQL Server expone DATEPART para obtener partes de una fecha. SQLite utiliza principalmente strftime() y otras funciones temporales. Si la consulta debe ser portable, encapsula o adapta esta parte por dialecto en lugar de fingir una sintaxis universal.

Qué debes recordar

  • EXTRACT obtiene una parte temporal sin convertir primero la fecha en texto.
  • PostgreSQL y MySQL comparten la forma básica; SQL Server y SQLite usan alternativas distintas.
  • Extraer año o mes es especialmente útil antes de agrupar y resumir datos.

Conceptos relacionados

Fuentes técnicas consultadas