PostgreSQL の 日付入りCTE をOracleに変換すると…

一ヶ月半も前の話になってしまいましたがOracle Code Tokyoの私のセッションでデモ予定
だったものをご紹介します。

上記ページを含むPDFは以下より。

Oracle Code Tokyoの私のSQLセッションのPDFアップロードされています

今日から使える! DBアプリ開発の負担を減らせる小技集

元々は以下のPostgreSQL用SQLを使おうと思ってましたが、、、

QiitaでPostgreSQLの似たものを見つけたのでこれをOracleで流してみます。

SQLのWITH句で任意の範囲の日付を取得する – Qiita

トランザクションデータを、ある区間の日付ごとに集計したい

こんな感じになると思います。今、https://livesql.oracle.com/ で確認しました。

alter session set nls_date_format='YYYY-MM-DD';
WITH  date_range(i, start_date, end_date) AS (
  SELECT 1, date '2016-01-01', date '2016-01-31' from dual
  UNION ALL
  SELECT i + 1
    , start_date + interval '1' month
    , start_date + interval '2' month - interval '1' day
  FROM date_range
  WHERE start_date < '2017-01-01'
)
SELECT date_range.*
FROM date_range

実行結果はこうなります。

I STARTDATE ENDDATE
1 2016-01-01 2016-01-31
2 2016-02-01 2016-02-29
3 2016-03-01 2016-03-31
4 2016-04-01 2016-04-30
5 2016-05-01 2016-05-31
6 2016-06-01 2016-06-30
7 2016-07-01 2016-07-31
8 2016-08-01 2016-08-31
9 2016-09-01 2016-09-30
10 2016-10-01 2016-10-31
11 2016-11-01 2016-11-30
12 2016-12-01 2016-12-31
13 2017-01-01 2017-01-31

13 rows selected.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s