PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como encontrar o intervalo entre duas datas no PostgreSQL

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