【问题标题】:How can I get all of the past months of the current year from DUAL?如何从 DUAL 获取当年过去的所有月份?
【发布时间】:2013-01-29 10:01:07
【问题描述】:

我只想得到过去的月份,所以说在 2 月它只会返回 1 月,而在 12 月它会返回 1 月至 11 月。

这将返回当年的所有月份。

 Select TO_CHAR( ADD_MONTHS( TRUNC(SYSDATE,'year') , LEVEL-1  ), 'YYYY-MM' ) Month
     FROM   dual
     CONNECT BY LEVEL <= 12;

【问题讨论】:

  • 您可能需要天数/周数,因为距离年初超过 1 个月。

标签: sql oracle plsql


【解决方案1】:

您只需要调整返回的行数,这由CONNECT BY 子句中的12 控制。像这样的东西应该可以工作

 Select TO_CHAR( ADD_MONTHS( TRUNC(SYSDATE,'year') , LEVEL-1  ), 'YYYY-MM' ) Month
   FROM dual
CONNECT BY LEVEL <= floor( months_between( sysdate, trunc(sysdate,'YYYY')))

【讨论】:

    【解决方案2】:

    稍微简单的版本:

    select add_months(trunc(sysdate,'YYYY'), level-1)
    from dual
    connect by level < to_char(sysdate,'MM');
    

    【讨论】:

      【解决方案3】:

      或者,如果想使用区间和 ANSI EXTRACT() 函数(这避免了使用 TO_CHAR(SYSDATE, 'MM') 的隐式转换——并不是说它会以任何方式影响此查询的运行速度):

       SELECT TRUNC(SYSDATE, 'YEAR') + NUMTOYMINTERVAL(LEVEL - 1, 'MONTH')
         FROM dual
      CONNECT BY LEVEL < EXTRACT(MONTH FROM SYSDATE);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多