O mundo dos bancos de dados e do frontend quase nunca concorda sobre como as datas devem aparecer. O PostgreSQL pode guardar datas como DATE, TIMESTAMP ou até TIMESTAMPTZ, mas esse formato nem sempre é legal pra mostrar pro usuário. Por exemplo, ao invés do padrão 2023-10-01 12:30:45, os designers podem querer ver 01 de outubro de 2023, 12:30. E às vezes precisa formatar a data pra relatórios ou pra API.
Pra converter datas pra string e vice-versa no PostgreSQL, tu vai usar as funções TO_CHAR() e TO_DATE().
Função TO_CHAR()
TO_CHAR() é tipo teu melhor amigo quando tu precisa transformar dados de tempo em um formato de string que qualquer um entende. Ela pega uma data ou timestamp e formata do jeito que tu quiser.
Sintaxe
TO_CHAR(value, format)
value— a data ou timestamp que tu quer converter.format— string com o template de formato, tipo como tu quer mostrar a data.
Exemplos de formatos
| Template de formato | Significado | Exemplo |
|---|---|---|
YYYY |
Ano | 2023 |
MM |
Mês (número de 01 até 12) | 10 |
MONTH |
Nome do mês (em MAIÚSCULO) | OCTOBER |
DAY |
Dia da semana (em MAIÚSCULO) | SUNDAY |
DD |
Dia do mês | 01 |
HH24 |
Hora no formato 24h | 15 |
MI |
Minutos | 45 |
SS |
Segundos | 30 |
Tu pode ver a lista completa de formatos na documentação oficial do PostgreSQL.
Exemplos de uso do TO_CHAR()
Formatando data pra relatório
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- Resultado: '09.10.2023'
Mostrando hora no formato 12h
SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- Resultado: '03:45 PM'
Mostrando o mês por extenso
SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- Resultado: 'October '
Repara: o PostgreSQL coloca um espaço no final. Isso é feature, não bug! Se quiser tirar os espaços, usa a função TRIM():
SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;
Criando um formato customizado
SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- Resultado: '2023/10/09 15:45:30'
Formatando pra interface do usuário
SELECT TO_CHAR(NOW(), 'DD "de outubro" YYYY ano') AS user_friendly_date;
-- Resultado: '09 de outubro 2023 ano'
Função TO_DATE()
TO_DATE() faz o contrário: ela pega uma string e transforma em tipo DATE. Pra quê isso? Por exemplo, o usuário pode digitar a data no formato 01-10-2023, e o PostgreSQL precisa "entender" que data é essa.
Sintaxe
TO_DATE(value, format)
value— string que tem a data.format— string com o template que explica o formato da string.
Exemplos de uso do TO_DATE()
Convertendo string pra data
SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- Resultado: '2023-10-01' (tipo: DATE)
Comparando data em string com data da tabela
Imagina que temos uma tabela appointments com a coluna appointment_date do tipo DATE. O usuário digita a data como string:
SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');
Formato errado
Importante: se o formato da string não bater com o template, vai dar erro! Tipo:
SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- Erro: formato de entrada inválido
Validando dados do usuário
Imagina que tu vai criar uma tabela pra guardar pedidos, onde a data é digitada pelo usuário:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE
);
-- Inserindo dados convertendo string pra data
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));
Exemplos práticos
Formatando relatório. Na tabela sales tem a data da venda na coluna sale_date (tipo TIMESTAMP). Precisa mostrar o relatório com as datas no formato DD.MM.YYYY.
-- Exemplo de dados
CREATE TABLE sales (
sale_id SERIAL PRIMARY KEY,
sale_date TIMESTAMP
);
INSERT INTO sales (sale_date)
VALUES
('2023-10-01 15:30:00'),
('2023-10-02 10:15:00'),
('2023-10-03 12:45:00');
-- Relatório
SELECT sale_id,
TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;
Convertendo dados do usuário. O usuário digita a data no formato string MM/DD/YYYY. Precisa converter pra DATE pra salvar no sistema.
INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));
Erros comuns e dicas
Formato errado. Um erro clássico é quando o formato da string não bate com o template. Tipo, se o usuário digitou 01-10-2023 e o formato tá MM/DD/YYYY, o PostgreSQL vai reclamar. Dica: sempre valida o input do usuário antes de mandar pro SQL.
Espaços nos formatos do TO_CHAR(). Alguns formatos, tipo MONTH, colocam espaços. Se isso for ruim, usa TRIM().
Erros ao fazer parsing de strings. Se a string tiver caracteres ou formato inesperado, o PostgreSQL não vai conseguir converter. Dica: usa regex ou faz checagens extras antes de inserir no banco.
Usando formatos de tempo errado. Tipo tentar tratar um TIMESTAMP com template de DATE. Dica: confere se os tipos de dados batem com o que tu precisa.
As funções TO_CHAR() e TO_DATE() abrem um monte de possibilidades pra trabalhar com dados de tempo. Tu pode criar formatos legais pra relatórios, converter input do usuário e deixar tuas queries SQL mais legíveis. Na vida real, essas funções são muito usadas pra visualização de dados, relatórios, integração com outros sistemas e pra deixar a interface do usuário mais amigável.
GO TO FULL VERSION