SQL时髦的持续时间查询

时间:2011-07-18 18:42:35

标签: sql postgresql datetime timestamp

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

  • 2011-06-26 17:07:38-04< - 开始日期
  • 2011-10-01 00:00:00-04< - 通缉日期
  • 91< - 持续时间

  • 2011-06-25 20:08:46-04< - 开始日期

  • 2011-09-01 00:00:00-04< - 通缉日期
  • 62< - 持续时间

以下是条件:

  • 如果是1日到25日,请加上两个月加上下一个第一天
  • 如果当天是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

2 个答案:

答案 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

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