3

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

如果此查询在 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 中,我将使用 CTE,就像在此页面上的 fn_nums 函数中一样。

4

3 回答 3

6

要显示从 1 到 100 的数字:

SELECT  LEVEL 
FROM DUAL
CONNECT BY LEVEL <= 100
ORDER BY LEVEL

要更改最大值,请在第三行进行更改。

于 2012-06-12T09:56:36.263 回答
3

这是一种方法:

  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;
于 2010-12-23T19:52:16.587 回答
1

与接受的答案类似,您可以用 with 子句替换内联视图。我发现 with 子句更具可读性。特别是如果您要对作为同一查询的一部分的即时 NUMBERS 表执行多个计算 - 整个 SQL 语句更具可读性。

即时数字表:

WITH NUMBERS_START_AT_ZERO AS
     (SELECT LEVEL - 1 AS NUM 
       FROM DUAL
       CONNECT BY LEVEL <= 4
       order by NUM desc)
SELECT  EXTRACT (YEAR FROM sysdate) - NUM AS YEARS
  FROM NUMBERS_START_AT_ZERO

输出:

YEARS
2009
2010
2011
2012
于 2012-10-03T16:11:43.840 回答