【问题标题】:Oracle SQL first and last day of quarter of any yearOracle SQL 任何一年季度的第一天和最后一天
【发布时间】:2013-09-04 06:30:06
【问题描述】:

有什么方法可以计算任何一年中三个季度的第一天和最后一天。 2012 年、2013 年或 2014 年

SELECT ADD_MONTHS(TRUNC(SYSDATE, 'Q'), -3) AS First,
       TRUNC(SYSDATE, 'Q') - 1             AS Last
FROM DUAL

计算当年第一季度。我想计算任何一年的第一季度?

【问题讨论】:

    标签: sql oracle oracle11g oracle-sqldeveloper


    【解决方案1】:

    您可以执行以下操作:

    with q(qtr) as(
      select add_months(
                        DATE '2013-01-01'
                        , (level-1)*3
                        )
        from dual 
      connect by level <= 4
    )
    select qtr                          as first_day
         , last_day(add_months(qtr, 2)) as last_day
      from q
    

    结果:

    FIRST_DAY     LAST_DAY
    -----------  -----------
    01.01.2013    31.03.2013
    01.04.2013    30.06.2013
    01.07.2013    30.09.2013
    01.10.2013    31.12.2013
    

    SQLFIddle Demo

    【讨论】:

    • 嗨,这不是我想要的。这是计算当年的季度。我想找到任何一年的季度。
    • @ManviKapoor 要显示first_daylast_day 值的不同年份部分,您只需将trunc(sysdate, 'Y') 更改为trunc(add_months(sysdate, [+-]12 * num_of_years_from_current_year), 'Y')
    • num_of_years_from_current_year 是什么?
    • 希望你不介意 Nicholas - 我已经更新了示例查询以显示如何获取任何给定年份的季度,希望这对于 OP 来说会更简单。
    • @JeffreyKemp 绝对不是,杰弗里。确实更简单。
    【解决方案2】:

    这是一种方法

    select  to_date('01-JAN-'||to_char(yr), 'DD-MON-YYYY') first_qtr,
       to_date('01-APR-'||to_char(yr), 'DD-MON-YYYY') second_qtr,
       to_date('01-JUL-'||to_char(yr), 'DD-MON-YYYY') third_qtr,
       to_date('01-OCT-'||to_char(yr), 'DD-MON-YYYY') fourth_qtr
       from ( select :year yr from dual )
    UNION ALL
    select to_date('01-APR-'||to_char(yr), 'DD-MON-YYYY')-1 first_qtr,
       to_date('01-JUL-'||to_char(yr), 'DD-MON-YYYY')-1 second_qtr,
       to_date('01-OCT-'||to_char(yr), 'DD-MON-YYYY')-1 third_qtr,
       to_date('01-JAN-'||to_char(yr+1), 'DD-MON-YYYY')-1 fourth_qtr
       from ( select :year yr from dual )
    

    我使用了绑定变量,因此请根据您的要求进行相应更改。

    我是 Oracle 的新手,所以其他人可以提供简化的代码。

    给定 2009 时的输出如下

    FIRST_QTR   SECOND_QTR  THIRD_QTR   FOURTH_QTR
    01/01/2009  04/01/2009  07/01/2009  10/01/2009
    03/31/2009  06/30/2009  09/30/2009  12/31/2009
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但也许这会有所帮助:

      WITH y1 AS (
          SELECT LEVEL + 2000 AS the_year
            FROM dual
         CONNECT BY LEVEL <= 20
      ), q1 AS (
          SELECT LEVEL AS the_quarter
            FROM dual
          CONNECT BY LEVEL <= 4
      )
      SELECT the_year, the_quarter
           , TO_CHAR(first_day, 'DAY') AS first_dw, first_day
           , TO_CHAR(last_day, 'DAY') AS last_dw, last_day
        FROM (
          SELECT the_year, the_quarter
               , ADD_MONTHS(TO_DATE(the_year, 'YYYY'), 3 * (the_quarter - 1)) AS first_day
               , ADD_MONTHS(TO_DATE(the_year, 'YYYY'), 3 * the_quarter) - 1 AS last_day
            FROM y1, q1
      )
      

      【讨论】:

        【解决方案4】:

        每年一行,每行由年份加上 8 个(=每季度 2 个日期)日期组成:

        with params as (
          select
            2012 as start_year,
            2014 as end_year
          from
            dual
        )
        select
                   start_year+ level - 1                          year,
          to_date((start_year+ level - 1) || '0101', 'yyyymmdd')  start_q1,
          to_date((start_year+ level - 1) || '0331', 'yyyymmdd')  end_q1  ,
          to_date((start_year+ level - 1) || '0401', 'yyyymmdd')  start_q2,
          to_date((start_year+ level - 1) || '0630', 'yyyymmdd')  end_q2  ,
          to_date((start_year+ level - 1) || '0701', 'yyyymmdd')  start_q3,
          to_date((start_year+ level - 1) || '0930', 'yyyymmdd')  end_q3  ,
          to_date((start_year+ level - 1) || '1001', 'yyyymmdd')  start_q4,
          to_date((start_year+ level - 1) || '1231', 'yyyymmdd')  end_q4
        from
          dual, params
        connect by
          start_year + level -1 <= end_year;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 2017-08-19
          • 1970-01-01
          相关资源
          最近更新 更多