如何在postgresql中减去开始和结束日期

时间:2017-07-20 18:26:03

标签: sql postgresql postgresql-9.1

我的开始日期为 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中解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为这个问题可能措辞得更好,但我看到了你的目标。

我对问题的解释

给定两个日期列,假设 start_date end_date ,您需要两列(可能是四个?)来描述以下两个区间:

  1. start_date 与其月末日期之间的间隔。
  2. end_date 的月初日期与 end_date 之间的间隔。
  3. 所以,给出 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个月的差异。如果是,则此代码仅生成开始日期的月份的最后一天,以及结束日期的月份的第一天(显然)。

    的修改

    • 缩短间隔语法。谢谢,Abelisto!