En el mundo de las bases de datos SQL, PostgreSQL es conocido por su robustez y su amplio conjunto de funciones. Una de ellas es su sólido soporte para los tipos de fecha y timestamp. En esta guía veremos cómo formatear fechas en PostgreSQL, con ejemplos de código. Este tutorial está dirigido a ingenieros de software y otras personas con perfil técnico que quieran ampliar sus conocimientos de PostgreSQL.
Antes de que sigas leyendo, quería contarte sobre nuestro gestor de bases de datos PostgreSQL moderno y rápido, Beekeeper Studio. Su editor SQL autocompleta mientras escribes y muestra los resultados al instante, así que probar estos formatos de fecha es muy fácil. Además, es gratis para PostgreSQL: descárgalo aquí.
Cómo funcionan las fechas en PostgreSQL
Antes de ver cómo formatear fechas, es fundamental entender cómo se representan en PostgreSQL. PostgreSQL usa el tipo de dato “Date” para guardar la fecha. Así se crea una tabla con una columna DATE.
CREATE TABLE orders (
order_id serial PRIMARY KEY,
order_date DATE NOT NULL
);
Ahora, insertemos algunos datos en la tabla orders.
INSERT INTO orders (order_date) VALUES
('2022-04-01'),
('2022-04-02'),
('2022-04-03');
PostgreSQL es listo y puede interpretar una fecha a partir de un string si la escribes en formato ISO 6801.
Cómo formatear fechas en PostgreSQL: usando la función TO_CHAR
La forma principal de formatear fechas en PostgreSQL es con la función TO_CHAR. TO_CHAR nos permite convertir tipos de fecha/hora en un string con un patrón específico. Así se usa:
TO_CHAR(date, format)
La lista completa de opciones de formato está en la documentación de PostgreSQL. Estas son las opciones de formato vigentes a enero de 2024:
| Patrón | Descripción |
|---|---|
| HH | hora del día (01–12) |
| HH12 | hora del día (01–12) |
| HH24 | hora del día (00–23) |
| MI | minuto (00–59) |
| SS | segundo (00–59) |
| MS | milisegundo (000–999) |
| US | microsegundo (000000–999999) |
| FF1 | décima de segundo (0–9) |
| FF2 | centésima de segundo (00–99) |
| FF3 | milisegundo (000–999) |
| FF4 | décima de milisegundo (0000–9999) |
| FF5 | centésima de milisegundo (00000–99999) |
| FF6 | microsegundo (000000–999999) |
| SSSS, SSSSS | segundos desde la medianoche (0–86399) |
| AM, am, PM o pm | indicador de meridiano (sin puntos) |
| A.M., a.m., P.M. o p.m. | indicador de meridiano (con puntos) |
| Y,YYY | año (4 o más dígitos) con coma |
| YYYY | año (4 o más dígitos) |
| YYY | últimos 3 dígitos del año |
| YY | últimos 2 dígitos del año |
| Y | último dígito del año |
| IYYY | año con numeración de semanas ISO 8601 (4 o más dígitos) |
| IYY | últimos 3 dígitos del año con numeración de semanas ISO 8601 |
| IY | últimos 2 dígitos del año con numeración de semanas ISO 8601 |
| I | último dígito del año con numeración de semanas ISO 8601 |
| BC, bc, AD o ad | indicador de era (sin puntos) |
| B.C., b.c., A.D. o a.d. | indicador de era (con puntos) |
| MONTH | nombre completo del mes en mayúsculas (rellenado con espacios hasta 9 caracteres) |
| Month | nombre completo del mes con inicial mayúscula (rellenado con espacios hasta 9 caracteres) |
| month | nombre completo del mes en minúsculas (rellenado con espacios hasta 9 caracteres) |
| MON | nombre abreviado del mes en mayúsculas (3 caracteres en inglés, la longitud varía según el idioma) |
| Mon | nombre abreviado del mes con inicial mayúscula (3 caracteres en inglés, la longitud varía según el idioma) |
| mon | nombre abreviado del mes en minúsculas (3 caracteres en inglés, la longitud varía según el idioma) |
| MM | número del mes (01–12) |
| DAY | nombre completo del día en mayúsculas (rellenado con espacios hasta 9 caracteres) |
| Day | nombre completo del día con inicial mayúscula (rellenado con espacios hasta 9 caracteres) |
| day | nombre completo del día en minúsculas (rellenado con espacios hasta 9 caracteres) |
| DY | nombre abreviado del día en mayúsculas (3 caracteres en inglés, la longitud varía según el idioma) |
| Dy | nombre abreviado del día con inicial mayúscula (3 caracteres en inglés, la longitud varía según el idioma) |
| dy | nombre abreviado del día en minúsculas (3 caracteres en inglés, la longitud varía según el idioma) |
| DDD | día del año (001–366) |
| IDDD | día del año con numeración de semanas ISO 8601 (001–371; el día 1 del año es el lunes de la primera semana ISO) |
| DD | día del mes (01–31) |
| D | día de la semana, de domingo (1) a sábado (7) |
| ID | día de la semana ISO 8601, de lunes (1) a domingo (7) |
| W | semana del mes (1–5) (la primera semana empieza el primer día del mes) |
| WW | número de semana del año (1–53) (la primera semana empieza el primer día del año) |
| IW | número de semana del año con numeración de semanas ISO 8601 (01–53; el primer jueves del año está en la semana 1) |
| CC | siglo (2 dígitos) (el siglo XXI empieza el 2001-01-01) |
| J | Fecha juliana (días enteros desde el 24 de noviembre de 4714 a. C. a la medianoche local; consulta la Sección B.7) |
| Q | trimestre |
| RM | mes en números romanos en mayúsculas (I–XII; I=enero) |
| rm | mes en números romanos en minúsculas (i–xii; i=enero) |
| TZ | abreviatura de la zona horaria en mayúsculas (solo en to_char) |
| tz | abreviatura de la zona horaria en minúsculas (solo en to_char) |
| TZH | horas de la zona horaria |
| TZM | minutos de la zona horaria |
| OF | desfase de la zona horaria respecto a UTC (solo en to_char) |
Ejemplos de formato de fechas
Empecemos convirtiendo nuestra fecha en un string sencillo y legible. Así se hace:
SELECT order_id, TO_CHAR(order_date, 'DD Mon YYYY') as formatted_date
FROM orders;
El resultado se vería así:
order_id | formatted_date
———+—————-
1 | 13 Jan 2024
2 | 12 Jan 2024
3 | 11 Jan 2024
4 | 10 Jan 2024
5 | 09 Jan 2024
También podemos extraer solo una parte de la fecha:
SELECT order_id, TO_CHAR(order_date, 'Day') as day_of_week
FROM orders;
order_id | day_of_week
———+————-
1 | Friday
2 | Thursday
3 | Wednesday
4 | Tuesday
5 | Monday
Incluso podemos combinar formatos si queremos:
SELECT order_id, TO_CHAR(order_date, 'Day, DD Mon YYYY') as detailed_date
FROM orders;
order_id | detailed_date
———+————————
1 | Friday, 13 Jan 2024
2 | Thursday, 12 Jan 2024
3 | Wednesday, 11 Jan 2024
4 | Tuesday, 10 Jan 2024
5 | Monday, 09 Jan 2024
Función EXTRACT
La función EXTRACT te da acceso fácil a todas las partes posibles de un valor de fecha/hora, como el año, el mes, el día, etc.
SELECT order_id, EXTRACT(MONTH from order_date) as order_month
FROM orders;
order_id | order_month
———+————
1 | 1
2 | 1
3 | 1
4 | 1
5 | 1
Esto es lo básico del formato de fechas en PostgreSQL. Con estas herramientas tendrás una base sólida para manejar datos de fecha. Como todo en programación, la práctica es clave: prueba estos comandos por tu cuenta y ve qué más se te ocurre. ¡Feliz programación!
De verdad deberías probar estas consultas en Beekeeper Studio. :-)
Beekeeper Studio es una GUI de PostgreSQL gratuita y de código abierto
¡Este es el cliente de PostgreSQL que estaba buscando! La interfaz es lo que lo hace diferente: limpia, intuitiva y potente. Adiós al torpe PGAdmin. - David Cyprian
Beekeeper Studio es un cliente de PostgreSQL rápido, intuitivo y fácil de usar. También es compatible con muchísimas otras bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de PostgreSQL sobre Beekeeper Studio
A diferencia de pgAdmin, Beekeeper es increíblemente fácil de usar sin quedarse corto en funciones, ¡y el precio es justo! La función de respaldo de bases de datos es especialmente útil. Simplemente un gran software.
Herramienta fabulosa, el IDE más práctico que he encontrado hasta ahora para administrar bases de datos Postgres y MySql: simplemente funciona, sin complicaciones :-)