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 |