PGSQL計算每月延期天數

該SQL可以實現一條記錄變成多條記錄

比如項目計劃開始時間 1月1日,項目實際開始時間 4月1日,則會產生4條數據,1月延期31天,2月延期 28天,3 月延期31天

4月延期1天
select p.name as 項目名稱,a.*,
case when a.計劃開始月份=a.實際開始月份                       then date_part('day', cast(a.實際開始 as TIMESTAMP)- cast(a.計劃開始 as TIMESTAMP))
     when a.實際開始>a.最後一天 and a.中間=a.計劃開始         then   date_part('day', cast(a.最後一天 as TIMESTAMP)- cast(a.計劃開始 as TIMESTAMP))
     when a.實際開始>a.最後一天 and a.中間<>a.計劃開始 and a.中間月<>a.實際開始月份 then   date_part('day', cast(a.最後一天 as TIMESTAMP)- cast(a.中間月 as TIMESTAMP))+1
     when a.實際開始月份=a.中間月 and a.計劃開始月份<>a.實際開始月份 then   date_part('day', cast(a.實際開始 as TIMESTAMP)- cast(a.實際開始月份 as TIMESTAMP))+1
else 0 end as 當月間隔
from (
select name
plan_start_time as 計劃開始,to_char(plan_start_time,'YYYY-MM-01') AS 計劃開始月份,
act_start_time  as 實際開始,to_char(act_start_time,'YYYY-MM-01') AS 實際開始月份,
generate_series(plan_start_time,act_start_time,'1 month' ) as 中間,
to_char(generate_series(plan_start_time,act_start_time,'1 month' ),'YYYY-MM-01') AS 中間月,
(date_trunc('month',generate_series(plan_start_time,act_start_time,'1 month' )) + interval '1 month - 1 day')::date as 最後一天
from 
project_list) as a
left join projects as p
on a.name=p.id::VARCHAR

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章