No mundo dos bancos de dados SQL, o PostgreSQL é amplamente conhecido por sua robustez e pelo rico conjunto de recursos. Um desses recursos é o forte suporte a tipos de data e timestamp. Neste guia, vamos explorar como formatar datas no PostgreSQL, com exemplos de código. Este tutorial é voltado para engenheiros de software e outras pessoas com perfil técnico que querem ampliar seus conhecimentos de PostgreSQL.
Entendendo datas no PostgreSQL
Antes de mergulhar em como formatar datas, é fundamental entender como as datas são representadas no PostgreSQL. O PostgreSQL usa o tipo de dado “Date” para armazenar datas. Veja como criar uma tabela com uma coluna DATE.
CREATE TABLE orders (
order_id serial PRIMARY KEY,
order_date DATE NOT NULL
);
Agora, vamos inserir alguns dados na tabela orders.
INSERT INTO orders (order_date) VALUES
('2022-04-01'),
('2022-04-02'),
('2022-04-03');
O PostgreSQL é esperto e consegue interpretar uma data a partir de uma string se você fornecer a data no formato ISO 6801.
Como formatar datas no PostgreSQL: usando a função TO_CHAR
O principal método para formatar datas no PostgreSQL é a função TO_CHAR. A TO_CHAR permite formatar tipos de data/hora em uma string com um padrão específico. Veja como usá-la:
TO_CHAR(date, format)
A lista completa de opções de formatação está disponível na documentação do PostgreSQL. Estas são as opções de formatação em janeiro de 2024:
| Padrão | Descrição |
|---|---|
| HH | hora do dia (01–12) |
| HH12 | hora do dia (01–12) |
| HH24 | hora do dia (00–23) |
| MI | minuto (00–59) |
| SS | segundo (00–59) |
| MS | milissegundo (000–999) |
| US | microssegundo (000000–999999) |
| FF1 | décimo de segundo (0–9) |
| FF2 | centésimo de segundo (00–99) |
| FF3 | milissegundo (000–999) |
| FF4 | décimo de milissegundo (0000–9999) |
| FF5 | centésimo de milissegundo (00000–99999) |
| FF6 | microssegundo (000000–999999) |
| SSSS, SSSSS | segundos desde a meia-noite (0–86399) |
| AM, am, PM or pm | indicador de meridiano (sem pontos) |
| A.M., a.m., P.M. ou p.m. | indicador de meridiano (com pontos) |
| Y,YYY | ano (4 ou mais dígitos) com vírgula |
| YYYY | ano (4 ou mais dígitos) |
| YYY | últimos 3 dígitos do ano |
| YY | últimos 2 dígitos do ano |
| Y | último dígito do ano |
| IYYY | ano com numeração de semanas ISO 8601 (4 ou mais dígitos) |
| IYY | últimos 3 dígitos do ano com numeração de semanas ISO 8601 |
| IY | últimos 2 dígitos do ano com numeração de semanas ISO 8601 |
| I | último dígito do ano com numeração de semanas ISO 8601 |
| BC, bc, AD ou ad | indicador de era (sem pontos) |
| B.C., b.c., A.D. ou a.d. | indicador de era (com pontos) |
| MONTH | nome completo do mês em maiúsculas (preenchido com espaços até 9 caracteres) |
| Month | nome completo do mês com inicial maiúscula (preenchido com espaços até 9 caracteres) |
| month | nome completo do mês em minúsculas (preenchido com espaços até 9 caracteres) |
| MON | nome abreviado do mês em maiúsculas (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| Mon | nome abreviado do mês com inicial maiúscula (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| mon | nome abreviado do mês em minúsculas (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| MM | número do mês (01–12) |
| DAY | nome completo do dia em maiúsculas (preenchido com espaços até 9 caracteres) |
| Day | nome completo do dia com inicial maiúscula (preenchido com espaços até 9 caracteres) |
| day | nome completo do dia em minúsculas (preenchido com espaços até 9 caracteres) |
| DY | nome abreviado do dia em maiúsculas (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| Dy | nome abreviado do dia com inicial maiúscula (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| dy | nome abreviado do dia em minúsculas (3 caracteres em inglês; o tamanho varia conforme o idioma) |
| DDD | dia do ano (001–366) |
| IDDD | dia do ano com numeração de semanas ISO 8601 (001–371; o dia 1 do ano é a segunda-feira da primeira semana ISO) |
| DD | dia do mês (01–31) |
| D | dia da semana, de domingo (1) a sábado (7) |
| ID | dia da semana ISO 8601, de segunda-feira (1) a domingo (7) |
| W | semana do mês (1–5) (a primeira semana começa no primeiro dia do mês) |
| WW | número da semana do ano (1–53) (a primeira semana começa no primeiro dia do ano) |
| IW | número da semana do ano com numeração de semanas ISO 8601 (01–53; a primeira quinta-feira do ano fica na semana 1) |
| CC | século (2 dígitos) (o século XXI começa em 2001-01-01) |
| J | Data juliana (dias inteiros desde 24 de novembro de 4714 a.C. à meia-noite local; veja a Seção B.7) |
| Q | trimestre |
| RM | mês em algarismos romanos maiúsculos (I–XII; I=janeiro) |
| rm | mês em algarismos romanos minúsculos (i–xii; i=janeiro) |
| TZ | abreviação do fuso horário em maiúsculas (suportado apenas em to_char) |
| tz | abreviação do fuso horário em minúsculas (suportado apenas em to_char) |
| TZH | horas do fuso horário |
| TZM | minutos do fuso horário |
| OF | diferença do fuso horário em relação ao UTC (suportado apenas em to_char) |
Exemplos de formatação de datas
Vamos começar convertendo nossa data em uma string simples e legível. Veja como fazer:
SELECT order_id, TO_CHAR(order_date, 'DD Mon YYYY') as formatted_date
FROM orders;
A saída ficaria assim:
order_id | formatted_date
———+—————-
1 | 13 Jan 2024
2 | 12 Jan 2024
3 | 11 Jan 2024
4 | 10 Jan 2024
5 | 09 Jan 2024
Também podemos extrair apenas uma parte da data:
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
Podemos até combinar formatos, se quisermos:
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
Função EXTRACT
A função EXTRACT oferece acesso fácil a todas as partes possíveis de um valor de data/hora, como ano, mês, dia 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
Esse é o básico da formatação de datas no PostgreSQL. Essas ferramentas devem dar uma base sólida para lidar com dados de data. Como tudo em programação, a prática é essencial: teste esses comandos você mesmo e veja o que mais consegue criar. Bom código!
Você deveria mesmo experimentar rodar essas consultas no Beekeeper Studio. :-)
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com SQL. É rápido, intuitivo e torna o trabalho com banco de dados prazeroso de novo."
"Já testei várias GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."