Oracleで連番を取得したい時ってありますよね!
連続した日付を取得したい時もありますよね!
取得できるととても便利なので備忘録として残しておきます。
DUAL表を使って連番を取得する
SELECT LEVEL SEQ
FROM DUAL
CONNECT BY LEVEL <= 10;
LEVELじゃなくてROWNUMでもできます。
SELECT ROWNUM SEQ
FROM DUAL
CONNECT BY ROWNUM <= 10;
SEQ 1 2 3 4 5 6 7 8 9 10
DUAL表を使って日付を複数行で取得する
SELECT A.DATE_FROM + LEVEL - 1 AS DATES
FROM(
SELECT TO_DATE('2021/12/25', 'YYYY/MM/DD') AS DATE_FROM
, TO_DATE('2022/01/05', 'YYYY/MM/DD') AS DATE_TO
FROM DUAL
) A
CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1;
日付取得もROWNUMでもできます。
SELECT A.DATE_FROM + ROWNUM - 1 AS DATES
FROM(
SELECT TO_DATE('2021/12/25', 'YYYY/MM/DD') AS DATE_FROM
, TO_DATE('2022/01/05', 'YYYY/MM/DD') AS DATE_TO
FROM DUAL
) A
CONNECT BY ROWNUM <= A.DATE_TO - A.DATE_FROM + 1;
SQL実行結果
DATES
2021-12-25 00:00:00
2021-12-26 00:00:00
2021-12-27 00:00:00
2021-12-28 00:00:00
2021-12-29 00:00:00
2021-12-30 00:00:00
2021-12-31 00:00:00
2022-01-01 00:00:00
2022-01-02 00:00:00
2022-01-03 00:00:00
2022-01-04 00:00:00
2022-01-05 00:00:00
例えば出勤時間・退勤時間を登録するテーブルがあったとして、そのテーブルからデータを取得すると休みの日の日付が取得できないので「休みの日付も取得できたらなぁ」ということもあると思います。
そんな時、DUAL表から取得した日付と外部結合すると日付の抜けがなくて便利!