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 ) iotDame 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 ) iotObtuve 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 .