Problema:
Você gostaria de encontrar a diferença entre dois valores de data/data e hora em um banco de dados PostgreSQL.
Exemplo:
Nosso banco de dados tem uma tabela chamada
employment
com dados nas colunas id
, first_name
, last_name
, start_date
e end_date
:id | first_name | last_name | data_inicial | end_date |
---|---|---|---|---|
1 | Bárbara | Wilson | 2010-02-01 | 2018-10-30 |
2 | Roberto | Anderson | 2001-04-17 | 20-12-2011 |
3 | Steven | Nelson | 2005-06-01 | 23-09-2019 |
Para cada funcionário, vamos obter seu nome e sobrenome e a diferença entre as datas de início e término de seu emprego. Queremos ver o intervalo em anos, meses e dias.
Solução 1:
Usaremos o
AGE()
função. Aqui está a consulta que você escreveria:SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Segue o resultado da consulta:
first_name | last_name | intervalo_de emprego |
---|---|---|
Bárbara | Wilson | 8 anos 8 meses 29 dias |
Roberto | Anderson | 10 anos 8 meses 3 dias |
Steven | Nelson | 14 anos 3 meses 22 dias |
Discussão:
Use o PostgreSQL
AGE()
função para recuperar o intervalo entre dois timestamps ou datas. Esta função recebe dois argumentos:o primeiro é a data final e o segundo é a data inicial. Em nosso exemplo, usamos a coluna end_date
(ou seja, quando o funcionário parou de fazer esse trabalho) e a coluna start_date
(quando o funcionário iniciou esse trabalho). A diferença entre as datas é retornada como um intervalo em anos, meses, dias, horas, etc. A consulta para Steven Nelson retornou o período de emprego como o intervalo '
14 years 3 months 22 days
'; esta é a diferença entre 2005-06-01, quando começou este trabalho, e 2019-09-23, quando o parou. A
AGE()
A função também pode exibir a diferença entre o timestamp/data atual e o primeiro argumento. Nesse caso, a função tem apenas um argumento:SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
A consulta acima exibe o intervalo entre o timestamp atual (para este texto, é '2019-09-26') e a data de término de cada funcionário (a coluna
end_date
). first_name | last_name | intervalo_de emprego |
---|---|---|
Bárbara | Wilson | 10 meses 27 dias |
Roberto | Anderson | 7 anos 9 meses 6 dias |
Steven | Nelson | 3 dias |
Três dias se passaram entre o último dia de trabalho de Steven e o carimbo de data/hora atual (no momento em que escrevo, é 26/09/2019).
Solução 2:
Você também pode usar o operador menos ( '-' ) em vez de
AGE()
para subtrair duas datas. Aqui está a consulta que você escreveria:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
Nesse resultado, você verá apenas a diferença em dias (não em anos, meses e dias):
first_name | last_name | intervalo_de emprego |
---|---|---|
Bárbara | Wilson | 3193 |
Roberto | Anderson | 3899 |
Steven | Nelson | 5227 |