Estoy tratando de calcular el tiempo prorrateado entre dos fechas durante períodos de varios meses usando SQL en PostgresSQL.
Mi fórmula es bastante simple.
select iot.*, (iot.DATE_FIN - iot.DATE_DEBUT)::double precision / NULLIF( extract (day from iot.DATE_FIN - date_trunc('month', iot.DATE_DEBUT)), 0::double precision) as prorata from ( select DATE '2020-05-01' as DATE_DEBUT, DATE '2020-05-31' as DATE_FIN ) iot
Dame el resultado esperado => 1
Pero cuando cambio a marchar con
select iot.*, (iot.DATE_FIN - iot.DATE_DEBUT)::double precision / NULLIF(extract (day from iot.DATE_FIN - date_trunc('month', iot.DATE_DEBUT)), 0::double precision) as prorata from ( select DATE '2020-03-01' as DATE_DEBUT, DATE '2020-03-31' as DATE_FIN ) iot
Obtuve un resultado extraño de 1.0344827586206897
¿Algunas ideas?
Esto es causado por date_trunc('month'
, esta función devuelve una fecha con una zona horaria, pero todo su cálculo no maneja la zona horaria.
Si obliga a Postgres a ignorar la zona horaria, debería funcionar:
select iot.*, (iot.DATE_FIN - iot.DATE_DEBUT)::double precision / NULLIF(extract (day from iot.DATE_FIN - date_trunc('month', iot.DATE_DEBUT)::timestamp without time zone), 0::double precision) as prorata from ( select DATE '2020-03-01' as DATE_DEBUT, DATE '2020-03-31' as DATE_FIN ) iot
Acabo de emitir date_trunc
con ::timestamp without time zone
.