【问题标题】:Rolling 6 Months dates in oracle在 oracle 中滚动 6 个月的日期
【发布时间】:2018-06-21 11:46:01
【问题描述】:

我想从 2016 年开始滚动六个月日期到当前日期,输出应该如下所示

 Year   Start_Date    End_Date
 2016   1/1/2016      30/6/2016
 2016   1/7/2016      31/12/2016
 2017   ... like this for 2017 & 2018

我试过像获取一年中的第一个日期一样

SELECT TRUNC(to_date(Date_key, 'YYYYMMDD'), 'YEAR')  
FROM Table; 

并从第一个日期开始添加六个月,但在这种情况下结束日期将是一个问题。有没有一个函数我可以在没有循环的情况下做到这一点?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    这样的?

    SQL> alter session set nls_date_format = 'dd.mm.yyyy';
    
    Session altered.
    
    SQL> select extract (year from add_months (date '2016-01-01', (level - 1) * 6)) year,
      2         add_months (date '2016-01-01', (level - 1) * 6) start_date,
      3         add_months (date '2016-01-01', (level) * 6) - 1 end_date
      4  from dual
      5  connect by level <= (extract (year from sysdate) - 2016 + 1) * 2;
    
          YEAR START_DATE END_DATE
    ---------- ---------- ----------
          2016 01.01.2016 30.06.2016
          2016 01.07.2016 31.12.2016
          2017 01.01.2017 30.06.2017
          2017 01.07.2017 31.12.2017
          2018 01.01.2018 30.06.2018
          2018 01.07.2018 31.12.2018
    
    6 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      你也可以试试这个,

      SELECT :p_from_year + CEIL(ROWNUM/2)-1,
          ADD_MONTHS(TRUNC(TO_DATE(:p_from_year + CEIL(rownum/2)-1, 'YYYY'), 'YYYY'),6-(MOD(rownum, 2)*6)) from_date,
          ADD_MONTHS(TRUNC(TO_DATE(:p_from_year + CEIL(rownum/2)-1, 'YYYY'), 'YYYY'),12-(MOD(rownum, 2)*6))-1 to_date
        FROM dual
        CONNECT BY CEIL(rownum/2)-1 <= (:p_to_year - :p_from_year)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-28
        • 2013-02-02
        • 2011-09-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        相关资源
        最近更新 更多