O PostgreSQL tem várias funções nativas pra trabalhar com valores de tempo atuais. Essas funções são úteis pra coisas tipo rastrear automaticamente quando um registro foi criado, montar relatórios baseados na data de hoje ou checar se um evento rolou num certo período. Bora ver três funções principais: NOW(), CURRENT_DATE e CURRENT_TIME.
NOW(): pegando a data e hora atual
A função NOW() retorna a data e hora atual no formato TIMESTAMP WITH TIME ZONE. Isso quer dizer que o resultado inclui o horário certinho levando em conta o fuso horário do servidor.
Exemplo:
SELECT NOW();
-- Resultado: 2025-05-25 14:30:45.761523+03
Repara que o resultado inclui:
- a data (
2025-05-25), - a hora (
14:30:45.761523), - o fuso (
+03).
Se você não quiser o fuso horário, pode converter o resultado pra TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Resultado: 2025-05-25 14:30:45.761523
CURRENT_DATE: pegando só a data de hoje
A função CURRENT_DATE retorna só a data de hoje, sem hora. O tipo do valor retornado é DATE.
Exemplo:
SELECT CURRENT_DATE;
-- Resultado: 2025-05-25
Isso é útil quando você não precisa se preocupar com a hora, tipo pra calcular idade ou agrupar dados por dia.
CURRENT_TIME: pegando só a hora atual
A função CURRENT_TIME retorna a hora atual no formato TIME WITH TIME ZONE. Se não quiser o fuso, pode converter pra TIME.
Exemplo:
SELECT CURRENT_TIME;
-- Resultado: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Resultado: 14:30:45.761523
Exemplos de uso das funções
Bora ver uns exemplos práticos de como essas funções podem ser úteis.
Preenchendo automaticamente a hora de criação do registro
Quando a gente adiciona registros numa tabela, é massa salvar automaticamente a data e hora de criação. No PostgreSQL dá pra fazer isso usando DEFAULT NOW() na criação da tabela.
Exemplo de criação de tabela:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- momento de criação da linha
);
Adicionando um registro:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Vamos ver o conteúdo da tabela:
SELECT * FROM orders;
Resultado:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Filtrando dados por data
Imagina que temos uma tabela de pedidos e queremos pegar todos os pedidos criados hoje. Vamos usar CURRENT_DATE pra filtrar:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Aqui a gente usa created_at::DATE pra ignorar a hora e pegar só a data.
Diferenças entre NOW() e CURRENT_TIMESTAMP
Parece que NOW() e CURRENT_TIMESTAMP fazem a mesma coisa. E é isso mesmo. Só que NOW() veio de um padrão, e CURRENT_TIMESTAMP de outro.
NOW() — função do PostgreSQL
A função NOW() é uma função nativa do PostgreSQL que retorna um valor do tipo TIMESTAMP WITH TIME ZONE (timestamptz). É a hora do servidor no momento em que o SQL começa a rodar.
Exemplo:
SELECT NOW();
CURRENT_TIMESTAMP — padrão SQL
CURRENT_TIMESTAMP é uma expressão definida pelo padrão SQL, e também retorna TIMESTAMP WITH TIME ZONE no PostgreSQL. Basicamente, o PostgreSQL implementa CURRENT_TIMESTAMP chamando a mesma função que NOW().
Exemplo:
SELECT CURRENT_TIMESTAMP;
Comparando na prática
SELECT NOW(), CURRENT_TIMESTAMP;
Resultado:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Os dois valores são iguais porque são calculados no mesmo momento — no começo da query.
Usando funções de tempo em condições de filtro
Agora bora fazer uma query que pega registros criados nos últimos 7 dias. Pra isso, dá pra usar NOW() com operações aritméticas de data:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Do mesmo jeito, se quiser pegar pedidos do mês atual, pode usar DATE_TRUNC() pra cortar o começo do mês:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() é uma função massa, vou falar mais dela em umas aulas pra frente :P
Dicas práticas
- Usa
NOW()ouCURRENT_TIMESTAMPse precisar da hora certinha com fuso horário. - Vai de
CURRENT_DATEse só a data já resolve (tipo pra calcular idade ou analisar eventos de um dia). CURRENT_TIMEé mais pra relatórios ou interfaces onde importa mostrar quanto tempo foi gasto numa tarefa.
Na próxima aula a gente vai começar a extrair partes de datas e horas usando as funções EXTRACT() e AGE(). Com elas dá pra, por exemplo, descobrir a idade de uma pessoa ou trabalhar com dados por dia, mês ou ano.
GO TO FULL VERSION