No PostgreSQL, o
date_trunc()
função trunca um valor de data/hora para uma precisão especificada. Ele também pode truncar o valor para uma precisão especificada em um fuso horário especificado.
Você pode pensar nisso como uma versão de data do
trunc()
função (que trunca números). Sintaxe
A sintaxe fica assim:
date_trunc(field, source [, time_zone ])
Onde:
field
é a precisão para a qual truncar o valor de entrada (por exemplomonth
,hour
, etc). Veja abaixo uma lista completa de valores aceitáveis para este argumento.source
é uma expressão de valor do tipo timestamp , carimbo de data e hora com fuso horário , ou intervalo . Observe que os valores do tipo data e tempo são convertidos automaticamente para timestamp ou intervalo , respectivamente.- O
time_zone
opcional argumento pode ser fornecido para especificar um fuso horário diferente.
O
field
argumento pode ser qualquer um dos seguintes:- microssegundos
- milissegundos
- segundo
- minuto
- hora
- dia
- semana
- mês
- trimestre
- ano
- década
- século
- milênio
Exemplo básico
Aqui está um exemplo para demonstrar.
SELECT date_trunc('hour', timestamp '2020-06-30 17:29:31');
Resultado:
2020-06-30 17:00:00
Podemos ver que a parte de hora da data foi truncada de
17:29:31
para 17:00:00
. Isso porque usei hour
para o primeiro argumento. Aqui está com valores diferentes para o primeiro argumento.
\x
SELECT
date_trunc('minute', timestamp '2020-06-30 17:29:31'),
date_trunc('day', timestamp '2020-06-30 17:29:31'),
date_trunc('month', timestamp '2020-06-30 17:29:31'),
date_trunc('year', timestamp '2020-06-30 17:29:31');
Resultado (usando saída vertical):
date_trunc | 2020-06-30 17:29:00 date_trunc | 2020-06-30 00:00:00 date_trunc | 2020-06-01 00:00:00 date_trunc | 2020-01-01 00:00:00
Neste caso eu usei
\x
para habilitar a saída de exibição/vertical expandida, para que seja mais fácil ler os resultados. Com fuso horário
Aqui está um exemplo para demonstrar o
WITH TIME ZONE
opção. SELECT
date_trunc('hour', timestamp with time zone '2020-06-30 17:29:31+00'),
date_trunc('hour', timestamp with time zone '2020-06-30 17:29:31+01');
Resultado:
date_trunc | 2020-07-01 03:00:00+10 date_trunc | 2020-07-01 02:00:00+10
O fuso horário local quando executei esses exemplos foi Austrália/Brisbane.
Você também pode adicionar o nome completo do fuso horário como um terceiro argumento.
SELECT
date_trunc('hour', timestamp with time zone '2020-06-30 17:29:31+12', 'Pacific/Auckland'),
date_trunc('hour', timestamp with time zone '2020-06-30 17:29:31+12', 'Pacific/Auckland');
Resultado:
date_trunc | 2020-06-30 15:00:00+10 date_trunc | 2020-06-30 15:00:00+10
Com intervalo
Aqui está um exemplo que usa um valor de intervalo em vez de uma data.
SELECT date_trunc('hour', interval '7 days 5 hours 15 minutes');
Resultado:
7 days, 5:00:00