我认为这个问题的措辞可以更好,但我明白你的意思。
我对问题的解释
给定两个日期列,比如 start_date 和 end_date,您需要两列(可能是四列?)来描述以下两个间隔:
-
start_date 与其月底日期之间的间隔。
-
end_date 的月初日期与 end_date 之间的间隔。
所以,给定一个 start_date
'2017-04-03'
和一个结束日期的
'2017-05-17'
您想要 start_date_to_month_end 范围
'2017-04-03 -> 2017-04-30'
和 month_start_to_end_date 范围
'2017-05-01 -> 2017-05-17'
我的解决方案(漂亮)
这个 postgres 查询(基于我正在使用的列名)将为您提供那些确切的结果:
select (to_char(start_date,'YYYY-MM-DD') || ' -> ' || to_char(date_trunc('month', start_date)+'1month -1day'::interval, 'YYYY-MM-DD')) as start_date_to_month_end, (to_char(date_trunc('month', end_date), 'YYYY-MM-DD') || ' -> ' || to_char(end_date, 'YYYY-MM-DD')) as month_start_to_end_date from mytable;
结果:
start_date_to_month_end | month_start_to_end_date
--------------------------+--------------------------
2017-04-03 -> 2017-04-30 | 2017-05-01 -> 2017-05-17
(1 row)
每列解决方案
那是所有漂亮的格式。如果您只想要四个简单列(start_date、month_end、month_start、end_date)的代码,那么:
开始日期:
start_date
月末:
date_trunc('month',start_date)+'1month -1day'::interval
month_start:
date_trunc('month',end_date)
结束日期:
end_date
这都是假设您的日期范围不超过 1 个月的差异。如果是这样,则此代码将仅生成开始日期为该月的最后一天,以及结束日期为该月的第一天(显然)。
编辑