postgreSQL funky time duration query



好的,这里是一些示例数据和我想要的预期结果:

  • 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

请注意,我没有必要的服务器类型来测试它,但这似乎是正确的。

相关内容

  • 没有找到相关文章

最新更新