小编典典

在Oracle中即时生成编号表

sql

如何根据当前日期返回包含过去四年的行集?

如果此查询在2010年12月31日运行,则应返回:

2007
2008
2009
2010

但是,如果它在2011年1月1日运行,则应返回:

2008
2009
2010
2011

这是我开始的工作,有两个查询返回了起始年份。我更喜欢第二种,因为转换为字符串对我来说有点脏。

SELECT TO_CHAR(TRUNC(sysdate, 'YY') - INTERVAL '3' YEAR, 'YYYY') FROM DUAL;
SELECT EXTRACT (YEAR FROM sysdate) - 3 FROM DUAL;

但是我不知道如何生成行来充实它。在SQL
Server中,我将像此页上的fn_nums函数一样使用CTE 。


阅读 221

收藏
2021-04-14

共1个答案

小编典典

这是一种方法:

  SELECT yr
    FROM (    SELECT EXTRACT (YEAR FROM (ADD_MONTHS ( SYSDATE, - ( (LEVEL - 1) * 12)))) yr
                FROM DUAL
          CONNECT BY LEVEL <= 4)
ORDER BY yr;

或者:

  SELECT yr
    FROM (    SELECT  EXTRACT (YEAR FROM sysdate) - (level -1 ) yr
                FROM DUAL
          CONNECT BY LEVEL <= 4)
ORDER BY yr;

或者:

    SELECT yr
      FROM (SELECT EXTRACT (YEAR FROM SYSDATE) - (x - 1) yr
              FROM DUAL
            MODEL
               DIMENSION BY (1 AS z)
               MEASURES (1 x)
               RULES
                  ITERATE (4)
                  (x [ITERATION_NUMBER] = ITERATION_NUMBER + 1))
  ORDER BY yr;
2021-04-14