Qual é a diferença entre DATE_PART e EXTRACT no Postgres?

Embora na prática as diferenças sejam muito sutis, o uso de do DATE_PART ou do EXTRACT pode influenciar a sua consulta ou o seu código.

Qual é a diferença entre DATE_PART e EXTRACT no Postgres?

📖 Índice

As duas funções são bem conhecidas e utilizadas no Postgres. Embora elas sejam muito semelhantes, elas contém diferenças muito sutis!

Essas diferenças, na prática não tem praticamente influência nenhuma na grande maiorias dos casos. Exceto claro em cenários muitos específicos. Então o uso da  date_part  ou da  extract  vai mais da escolha do analista e/ou opção por usar um padrão mais SQL.

Quais são as diferenças entre DATE_PART e EXTRACT?

A primeira diferença é a sintaxe

A função date_part  possui a seguinte sintaxe: date_part( unidade, data ) onde unidade é o que você precisa extrair da data e a data é a data, ou hora, ou timestamp ou intervalo. Os dois parâmetros são obrigatórios e separados por virgula.

Já a função extract  possui a seguinte sintaxe: extract( unidade from data ) onde unidade é o que você precisa extrair da data e a data é a data, ou hora, ou timestamp ou intervalo. Os dois parâmetros são obrigatórios e separados por "from".

Os valores para  unidade são os mesmos. No final do artigo tem uma tabela com todos os valores possíveis.

A segunda diferença é a tipo de retorno

Enquanto a função date_part  retorna um valor do tipo numeric, a função extract  retorna um valor do tipo float8. Até antes da versão 14 do Postgres as funções eram iguais.

A partir da versão 14, essa mudança foi implementada para melhorar a precisão do retorno para casos específicos. Essa mudança foi publicada no release notes da versão 14 (https://www.postgresql.org/docs/release/14.0/).

Segue um exemplo desse diferença usando as duas funções para extrair o epoch de um timestamp.

/* Exemplo da EXTRACT extraindo o epoch de um timestamp */
SELECT extract('epoch' from timestamp '2023-12-25 05:39:35-03');

/* output */
1703482775.000000


/* Exemplo da DATE_PART extraindo o epoch de um timestamp */
SELECT date_part('epoch', timestamp '2023-12-25 05:39:35-03');

/* output */
1703482775
Observe que a precisão do retorno é diferente.

A terceira diferença é o padrão

Por fim, a terceira diferença entra as duas funções é o padrão. A função extract  segue o padrão SQL. Com isso, é mais fácil para os programadores entenderem a sintaxe e o objetivo da função. Exemplo disso é que o uso da extract tanto no Postgres quanto no MySQL por exemplo, seria o mesmo.

Se chegou até aqui, não deixe de conferir o nosso Guia completo de funções do Postgres:

Tudo sobre Postgres: Principais funções | 🟢 200 OK
Série Tudo sobre Postgres: Principais funções do Postgres (trim, upper, current_date, age, etc.)

Tipos de unidade para extrar da função EXTRACT ou DATE_PART

Unidade para extrair Para que serve
century Retorna o numero do século
day Dia do mês de 1 até 31
decade Retorna a década, basicamente o ano dividido por 10
dow Dia da semana (Day of the week) onde 0 é domingo, 1 é segunda, etc
doy Dia do ano (Day of the year) onde 1 é o primeiro dia
epoch Epoch do Linux. Quantidade de segundos desde '1970-01-01 00:00:00 UTC'
hour Hora de 0 até 23
isodow Dia da semana (Day of the week) onde 1 é segunda, etc
isoyear Ano no formato ISO 8601
microseconds Micro segundos
millennium Milênio
milliseconds Milisegundos
minute Minuto de 0 até 59
month Mês de 1 até 12, se for uma data. Quantidade de meses de 0 até 11 se for um intervalo
quarter Trimestre de 1 até 4
second Segundos
timezone Timezone
timezone_hour A hora do timezone
timezone_minute O minuto do timezone
week Numero da semana do ano no formato ISO 8601
year Ano