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 |