好的,这里是一些示例数据和我想要的预期结果:
- 2011-06-26 17:07:38-04 <—开始日期
- 2011-10-01 00:00:00-04 <—通缉日期
-
91 <—天数
-
2011-06-25 20:08:46-04 & lt;——开始日期
- 2011-09-01 00:00:00-04 <—通缉日期
- 62 <—持续时间(天)
条件如下:
- 如果是1号到25号,加上两个月加上离下一个1号的天数
- 如果日期是从26日到月底,则加上三个月加上距离下一个第一天的天数
这就是我正在尝试的,我已经接近了,但是这似乎要做大量的计算,我想看看我是否可以简化它:
CASE
WHEN (((DATE_TRUNC('month',
(date_field + INTERVAL '5 DAYS')) + INTERVAL '2 MONTH') -
(date_field + INTERVAL '5 DAYS') >= 62) AND
((DATE_TRUNC('month', (date_field + INTERVAL '5 DAYS')) +
INTERVAL '2 MONTH') - (date_field + INTERVAL '5 DAYS') <= 92))
THEN (DATE_TRUNC('month',
(date_field + INTERVAL '5 DAYS')) + INTERVAL '2 MONTH')
ELSE (DATE_TRUNC('month',
(date_field + INTERVAL '5 DAYS')) + INTERVAL '3 MONTH')
END
select
case
when extract(day from date_field) <= 25
then date_trunc('month', date_field + interval '3 months')
else date_trunc('month', date_field + interval '4 months')
end
from t
我认为你的逻辑检查和实际数学是落后的。根据您的需求,它应该更接近如下:
CASE WHEN EXTRACT(DAY FROM date_field) BETWEEN 1 AND 25
THEN (date_field - EXTRACT(DAY FROM date_field):: int + 1 + INTERVAL '3 MONTH')
ELSE (date_field - EXTRACT(DAY FROM date_field):: int + 1 + INTERVAL '4 MONTH') END
请注意,我没有必要的服务器类型来测试它,但这似乎是正确的。