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
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
| id | fecha_pedido |
|---|---|
| 1 | 2025-12-20 |
| 2 | 2026-01-12 |
| 3 | 2026-07-03 |
| 4 | 2026-08-01 |
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.
SELECT id,
CAST(strftime('%Y', fecha_pedido) AS INTEGER) AS anio
FROM pedidos
ORDER BY id;| id | anio |
|---|---|
| 1 | 2025 |
| 2 | 2026 |
| 3 | 2026 |
| 4 | 2026 |
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:
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
La intención es la misma, pero la función cambia. Separa el concepto general de la sintaxis específica del motor.
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
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
EXTRACTobtiene 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.