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.
📖 Í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.
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:
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 |