CodeGym /Cursos /SQL SELF /Conversão de formatos de data

Conversão de formatos de data

SQL SELF
Nível 31 , Lição 3
Disponível

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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION