sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo encontrar el intervalo entre dos fechas en PostgreSQL

Problema:

Le gustaría encontrar la diferencia entre dos valores de fecha/fechahora en una base de datos PostgreSQL.

Ejemplo:

Nuestra base de datos tiene una tabla llamada employment con datos en las columnas id , first_name , last_name , start_date y end_date :

id nombre apellido fecha_inicio fecha_finalización
1 Bárbara Wilson 2010-02-01 2018-10-30
2 Roberto Anderson 2001-04-17 2011-12-20
3 Esteban Nelson 2005-06-01 2019-09-23

Para cada empleado, obtengamos su nombre y apellido y la diferencia entre las fechas de inicio y finalización de su empleo. Queremos ver el intervalo en años, meses y días.

Solución 1:

Usaremos el AGE() función. Esta es la consulta que escribirías:

SELECT first_name, 
             last_name, 
             AGE(end_date, start_date) 
         AS  employment_interval 
FROM employment;

Este es el resultado de la consulta:

nombre apellido intervalo_de_empleo
Bárbara Wilson 8 años 8 meses 29 días
Roberto Anderson 10 años 8 meses 3 días
Esteban Nelson 14 años 3 meses 22 días

Discusión:

Use PostgreSQL AGE() función para recuperar el intervalo entre dos marcas de tiempo o fechas. Esta función toma dos argumentos:el primero es la fecha de finalización y el segundo es la fecha de inicio. En nuestro ejemplo, usamos la columna end_date (es decir, cuando el empleado dejó de hacer ese trabajo) y la columna start_date (cuando el empleado comenzó ese trabajo).

La diferencia entre fechas se devuelve como un intervalo en años, meses, días, horas, etc. La consulta de Steven Nelson devolvió el período de empleo como el intervalo '14 years 3 months 22 days '; esta es la diferencia entre 2005-06-01, cuando comenzó este trabajo, y 2019-09-23, cuando lo dejó.

La AGE() La función también puede mostrar la diferencia entre la marca de tiempo/fecha actual y el primer argumento. En este caso, la función tiene un solo argumento:

SELECT first_name,
             last_name,
             AGE(end_date)
         AS  employment_interval
FROM employment;

La consulta anterior muestra el intervalo entre la marca de tiempo actual (para este texto, es '2019-09-26') y la fecha de finalización de cada empleado (la columna end_date ).

nombre apellido intervalo_de_empleo
Bárbara Wilson 10 meses 27 días
Roberto Anderson 7 años 9 meses 6 días
Esteban Nelson 3 días

Han transcurrido tres días entre el último día de Steven en el trabajo y la marca de tiempo actual (en el momento de escribir este artículo, eso es 2019-09-26).

Solución 2:

También puede usar el operador menos ('-') en lugar de AGE() para restar dos fechas.

Esta es la consulta que escribirías:

SELECT first_name,
             last_name,
             end_date::DATE – start_date::DATE 
         AS  employment_interval 
FROM employment;

En este resultado, solo verá la diferencia en días (no en años, meses ni días):

nombre apellido intervalo_de_empleo
Bárbara Wilson 3193
Roberto Anderson 3899
Esteban Nelson 5227