Formatar uma data transforma a data em texto no layout que você escolher, como 03/15/2026 ou Thursday, January 15. Cada banco de dados tem sua própria função para isso, e os exemplos cobrem PostgreSQL, MySQL, SQLite e SQL Server.
Como formatar datas em SQL
Passe para a função uma data e uma string de formato. Os códigos na string de formato representam partes da data, e todo o resto é copiado como está. No SQLite a função é strftime(), e os códigos começam com %:
strftime(format, date)
SELECT strftime('%m/%d/%Y', '2026-03-15');
-- Output: 03/15/2026
SELECT strftime('%I:%M %p', '2026-03-15 14:30:00');
-- Output: 02:30 PM
Em uma coluna, a mesma data pode sair em quantos layouts você precisar:
-- Input: orders
-- order_id | order_date
-- ---------+--------------------
-- 1 | 2026-01-15 09:42:00
-- 2 | 2026-03-02 16:05:00
SELECT
order_date,
strftime('%Y-%m-%d', order_date) AS iso_date,
strftime('%m/%d/%Y', order_date) AS us_date,
strftime('%d/%m/%Y', order_date) AS european_date
FROM orders;
-- Output:
-- order_date | iso_date | us_date | european_date
-- --------------------+------------+------------+--------------
-- 2026-01-15 09:42:00 | 2026-01-15 | 01/15/2026 | 15/01/2026
-- 2026-03-02 16:05:00 | 2026-03-02 | 03/02/2026 | 02/03/2026
Estes são os códigos que você mais vai usar, com o resultado de cada um para 2026-03-15 14:30:45:
| Código | Significado | Exemplo |
|---|---|---|
%Y |
Ano com 4 dígitos | 2026 |
%m |
Mês (01-12) | 03 |
%d |
Dia do mês (01-31) | 15 |
%H |
Hora, formato 24 horas (00-23) | 14 |
%I |
Hora, formato 12 horas (01-12) | 02 |
%p |
AM ou PM | PM |
%M |
Minuto (00-59) | 30 |
%S |
Segundo (00-59) | 45 |
%w |
Dia da semana (0-6, domingo é 0) | 0 |
Regras importantes
-
O SQLite não tem códigos para nomes de dias ou meses. Códigos como
%ae%Bfazem ostrftime()retornar NULL. Em vez disso, converta%wou%mem um nome comCASE(veja a seção sobre dia da semana abaixo). -
O resultado é texto. Comparar ou ordenar datas formatadas compara strings, o que só bate com a ordem das datas quando o ano vem primeiro:
-- Input: sales
-- id | sale_date | amount
-- ---+------------+-------
-- 1 | 2025-11-20 | 89.0
-- 2 | 2026-01-08 | 120.0
-- 3 | 2026-03-04 | 64.5
-- Wrong: '11/2025' > '02/2026' is true, because '1' > '0'
SELECT * FROM sales
WHERE strftime('%m/%Y', sale_date) > '02/2026';
-- Output:
-- id | sale_date | amount
-- ---+------------+-------
-- 1 | 2025-11-20 | 89.0
-- 3 | 2026-03-04 | 64.5
-- Right: put the year first
SELECT * FROM sales
WHERE strftime('%Y-%m', sale_date) > '2026-02';
-- Output:
-- id | sale_date | amount
-- ---+------------+-------
-- 3 | 2026-03-04 | 64.5
-
Entra NULL, sai NULL.
strftime('%Y-%m-%d', NULL)retorna NULL. Envolva comCOALESCE()para mostrar outra coisa, como'No date'. -
Filtre pela data, formate para exibir.
WHERE order_date >= '2026-01-01' AND order_date < '2027-01-01'retorna as mesmas linhas queWHERE strftime('%Y', order_date) = '2026', mas só a primeira pode usar um índice emorder_date.
Sintaxe alternativa
PostgreSQL, MySQL e SQL Server têm cada um sua própria função e seus códigos:
-- PostgreSQL: TO_CHAR(value, pattern)
-- (FM stops it padding the day name to 9 characters)
SELECT TO_CHAR(TIMESTAMP '2026-01-15 09:42:00', 'FMDay, MM/DD/YYYY HH24:MI');
-- Output: Thursday, 01/15/2026 09:42
-- MySQL: DATE_FORMAT(value, pattern)
-- (%i is the minute; %M would be the month name)
SELECT DATE_FORMAT('2026-01-15 09:42:00', '%W, %m/%d/%Y %H:%i');
-- Output: Thursday, 01/15/2026 09:42
-- SQL Server: FORMAT(value, pattern)
-- (MM is the month, mm the minute)
SELECT FORMAT(CAST('2026-01-15 09:42:00' AS datetime2), 'dddd, MM/dd/yyyy HH:mm');
-- Output: Thursday, 01/15/2026 09:42
-- Older SQL Server code uses CONVERT with a style number (101 is mm/dd/yyyy)
SELECT CONVERT(VARCHAR(10), CAST('2026-01-15' AS date), 101);
-- Output: 01/15/2026
Quando você deve formatar datas?
Formate uma data quando ela precisar ser exibida ou agrupada como texto. A maioria dos usos se encaixa em um destes quatro.
Exibir datas em um layout padrão
Use ISO 8601 (YYYY-MM-DD) para arquivos e APIs, MM/DD/YYYY para leitores dos EUA e DD/MM/YYYY para a maior parte da Europa e o Brasil. Formatar também descarta a hora quando você só quer a data.
Agrupar linhas por mês ou ano
Extraia só a parte da data que você quer, como %Y para o ano ou %Y-%m para o mês, e agrupe pelo resultado para obter totais anuais ou mensais.
Escrever datas legíveis
Misture códigos com palavras em rótulos, lembretes e e-mails. “03/16 at 02:30 PM” é mais fácil de ler que “2026-03-16 14:30:00”.
Trabalhar com o dia da semana
%w retorna o dia da semana como um número de 0 (domingo) a 6 (sábado). Filtre por ele para encontrar dias úteis ou fins de semana, ou converta-o em um nome com CASE.
Exemplos reais de formatação de datas
Marcar uma exportação com horários ISO 8601
Uma API espera timestamps como 2026-03-15T08:05:12Z. Os horários em audit_log são armazenados em UTC, então coloque o T e o Z em volta dos códigos (SQLite):
-- Input: audit_log
-- id | action | logged_at
-- ---+--------+--------------------
-- 1 | login | 2026-03-15 08:05:12
-- 2 | export | 2026-03-15 14:30:45
-- 3 | logout | 2026-03-15 17:58:03
SELECT
id,
action,
strftime('%Y-%m-%dT%H:%M:%SZ', logged_at) AS logged_at_iso
FROM audit_log;
-- Output:
-- id | action | logged_at_iso
-- ---+--------+---------------------
-- 1 | login | 2026-03-15T08:05:12Z
-- 2 | export | 2026-03-15T14:30:45Z
-- 3 | logout | 2026-03-15T17:58:03Z
Contar cadastros por mês
Agrupe os usuários pelo mês em que se cadastraram (PostgreSQL). YYYY-MM mantém os meses em ordem cronológica:
-- Input: users
-- id | name | signup_date
-- ---+------------+------------
-- 1 | Ana Lima | 2026-01-08
-- 2 | Ben Okafor | 2026-01-27
-- 3 | Chloe Park | 2026-02-14
-- 4 | Dev Mehta | 2026-03-03
-- 5 | Elle Novak | 2026-03-30
SELECT
TO_CHAR(signup_date, 'YYYY-MM') AS month,
COUNT(*) AS signups
FROM users
GROUP BY TO_CHAR(signup_date, 'YYYY-MM')
ORDER BY month;
-- Output:
-- month | signups
-- --------+--------
-- 2026-01 | 2
-- 2026-02 | 1
-- 2026-03 | 2
Escrever uma confirmação de reserva
Escreva o dia e o mês por extenso em uma mensagem de confirmação (SQL Server):
-- Input: bookings
-- guest_name | booking_time
-- ------------+--------------------
-- Priya Patel | 2026-03-16 14:30:00
-- Liam Murphy | 2026-03-18 09:15:00
SELECT
guest_name,
FORMAT(booking_time, 'dddd, MMMM d') + ' at ' + FORMAT(booking_time, 'h:mm tt') AS confirmation
FROM bookings;
-- Output:
-- guest_name | confirmation
-- ------------+-------------------------------
-- Priya Patel | Monday, March 16 at 2:30 PM
-- Liam Murphy | Wednesday, March 18 at 9:15 AM
Encontrar o dia mais movimentado da semana
Conte os pedidos pelo nome do dia em que foram feitos (MySQL):
-- Input: orders
-- order_id | order_date
-- ---------+--------------------
-- 1 | 2026-03-07 10:12:00
-- 2 | 2026-03-09 16:40:00
-- 3 | 2026-03-14 11:05:00
-- 4 | 2026-03-16 09:20:00
-- 5 | 2026-03-21 13:45:00
SELECT
DATE_FORMAT(order_date, '%W') AS weekday,
COUNT(*) AS order_count
FROM orders
GROUP BY weekday
ORDER BY order_count DESC;
-- Output:
-- weekday | order_count
-- ---------+------------
-- Saturday | 3
-- Monday | 2
Leitura complementar sobre formatação de datas
Neste blog:
-
Guia de formatação de datas no PostgreSQL: mais padrões de
TO_CHAR - Guia de SQL DATEDIFF: o tempo entre duas datas
-
Guia para inserir datas em SQL: a direção oposta, de texto para datas com
STR_TO_DATE()e similares - Como selecionar apenas dias úteis no PostgreSQL: filtrando pelo dia da semana
- Guia de SQL GROUP BY: agrupando linhas em totais mensais ou anuais
- Guia da instrução SQL CASE: convertendo números de dias em nomes
Documentação oficial:
- PostgreSQL: Data Type Formatting Functions
- MySQL: DATE_FORMAT()
- SQLite: Date and Time Functions
- SQL Server: FORMAT e CAST and CONVERT
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 muitas GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."