我的开始日期为 2017年4月3日,结束日期 2017年5月17日,条件是我必须有2个答案我应截断4月答案 2017年4月30日所以我(2017年4月30日 - 2017年4月3日)和5月回答(2017年5月17日 - 2017年5月1日)。
如何在PostgreSQL中解决这个问题?
答案 0 :(得分:0)
我认为这个问题可能措辞得更好,但我看到了你的目标。
给定两个日期列,假设 start_date 和 end_date ,您需要两列(可能是四个?)来描述以下两个区间:
所以,给出 start_date
'2017-04-03'
和
的 end_date'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
MONTH_END :
date_trunc('month',start_date)+'1month -1day'::interval
MONTH_START :
date_trunc('month',end_date)
END_DATE :
end_date
这是假设您的日期范围不超过1个月的差异。如果是,则此代码仅生成开始日期的月份的最后一天,以及结束日期的月份的第一天(显然)。