3

現在の日付に基づいて過去 4 年間で構成される行セットを返すにはどうすればよいですか?

このクエリを 2010 年 12 月 31 日に実行すると、次のように返されます。

2007
2008
2009
2010

ただし、2011 年 1 月 1 日に実行すると、次のように返されます。

2008
2009
2010
2011

これが私が始めたもので、開始年を返す 2 つのクエリです。文字列への変換は私には少し汚いと感じるので、私は2番目を好みます。

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 を使用します。

4

3 に答える 3

6

1から100までの数字を表示するには:

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

最大値を変更するには、3行目で最大値を変更します。

于 2012-06-12T09:56:36.263 に答える
3

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;
于 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 に答える