放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

OracleDBで任意の日付データセットを得る

SQLのクエリで日付のデータセットを得たいときは以下のようなSELECT文を発行すればいい。

SELECT SYSDATE + ROWNUM - 1 FROM ALL_CATALOG WHERE ROWNUM < 3;

June, 05 2014 15:39:59+0000
June, 06 2014 15:39:59+0000
ROWNUM
SELECTの結果セットの各レコードについて1から始まる昇順の数値が割り当てられる。
ALL_CATALOG
現行のユーザがアクセス可能な全ての表、クラスタ、ビュー、シノニムおよび順序を示す。ある程度の行数の結果セットを得る際に、その行数確保のために便宜上FROM句に用いられることがある。1行の結果がほしい際にはDUALが用いられることが多い。
サンプル

今日から明後日までの日付を時間を切り捨てて得る

SELECT TRUNC(SYSDATE + ROWNUM - 1) FROM ALL_CATALOG WHERE ROWNUM < 4;

June, 05 2014 00:00:00+0000
June, 06 2014 00:00:00+0000
June, 07 2014 00:00:00+0000

先月の最初の3日を得る

SELECT TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM') + ROWNUM - 1 FROM ALL_CATALOG WHERE ROWNUM < 4;

May, 01 2014 00:00:00+0000
May, 02 2014 00:00:00+0000
May, 03 2014 00:00:00+0000

今年の各月の最終日を得る

SELECT LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), ROWNUM-1)) FROM ALL_CATALOG WHERE ROWNUM < 13;

January, 31 2014 00:00:00+0000
February, 28 2014 00:00:00+0000
March, 31 2014 00:00:00+0000
April, 30 2014 00:00:00+0000
May, 31 2014 00:00:00+0000
June, 30 2014 00:00:00+0000
July, 31 2014 00:00:00+0000
August, 31 2014 00:00:00+0000
September, 30 2014 00:00:00+0000
October, 31 2014 00:00:00+0000
November, 30 2014 00:00:00+0000
December, 31 2014 00:00:00+0000

今年の各月の最終日の日付の数値を得る

SELECT TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), ROWNUM-1)), 'DD')) FROM ALL_CATALOG WHERE ROWNUM < 13;

31
28
31
30
31
30
31
31
30
31
30
31

上記の結果はいずれも「SQL Fiddle」で実行したもの

http://sqlfiddle.com/