这里有一些示例数据和我想要的预期结果:
91< - 持续时间
2011-06-25 20:08:46-04< - 开始日期
以下是条件:
这是我正在尝试的,我很接近,但这似乎做了大量的计算,我想看看我是否可以简化它:
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
答案 0 :(得分:3)
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
答案 1 :(得分:1)
我认为你的逻辑检查和你的实际数学是落后的。鉴于您的要求,它应该更接近这一点:
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
请注意,我没有必要的服务器类型来测试它,但这似乎是正确的。