Db2 11.1には、日付操作を行う関数についても多くの拡張があり、日付・時刻操作をSQLでより簡単に行えるようになっています。
日付・時刻操作に関して、Oracle, Netteza, PostgreSQL, MySQLなど、他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるよう、SQLの互換性がより強化されています。
参考(前回記事) Db2:日付,時刻の操作を行う関数(NOW,EXTRACT)
DATE_PART関数
DATE_PARTは、前回紹介したEXTRACT関数に似ています。
DATE_PART ( element, expression )
DATE_PARTでは、elementはEXTRACT関数と違い、クオーテーションマークで囲む必要があります。
また、DATE_PART関数の結果のデータ・タイプは BIGINT です。
一方、EXTRACT関数の場合は、戻されるelementによて結果のデータ・タイプは異なります。
例えば、SECOND(秒)のオプションを比べた場合、EXTRACTではDECIMAL型で結果が戻り、DATE_PARTではBIGINTになります。
element | 説明 |
---|---|
EPOCH | 指定された日付またはタイム・スタンプ式の 1970-01-01 00:00:00.00 以降の秒数 (正または負の値) |
MILLENNIUM(S) | 1000 年の長さがいくつ含まれるか |
CENTURY(CENTURIES) | 100 年の長さがいくつ含まれるか |
DECADE(S) | 10 年の長さがいくつ含まれるか |
YEEAR(S) | 年部分 |
QUARTER | 四半期 (1、2、3、または 4) |
MONTHE | 月 (1から12) |
WEEK | 年間通算週番号 (1 から 53) |
DAY(S) | 日の番号 (1から31) |
DOW | 曜日を示す数値 (日曜日は 1、月曜日は 2、…、土曜日は 7) |
DOY | 年間通算日を示す数値 (1 から 366) |
HOUR(S) | 時間部分 |
MINUTE(S) | 分部分 |
SECOND(S) | 秒部分 |
MILLISECOND(S) | 秒部分 (1000 分の 1 秒までの小数部分を含む) に1000 を掛けた値 (0 から 59999) |
MICROSECOND(S) | 秒部分 (100 万分の 1 秒までの小数部分を含む) に1000000 を掛けた値 (0 から 59999999) |
NOW関数は、SQLステートメントが現行サーバーで実行された時の読み取り値に基づくタイム・スタンプを戻します。
NOW関数によって戻される値は、CURRENT TIMESTAMP特殊レジスターによって戻される値と同じです。
つまり、NOWはCURRENT TIMESTAMPのシノニムです。
Db2のSAMPLEデータベースに接続して、次のSQLを実行します。
VALUES NOW
1
--------------------------
2018-08-24-13.51.04.382000
1 レコードが選択されました。
DATE_FUNCとNOWを使ってSQLを実行してみる
Db2 11.1のSAMPLEデータベースに接続し、DATE_PARTとNOWを使って、日付や時刻値を抽出するSQLを実行します。
長いので、date_func2.sqlというテキストファイルにSQLを書いて保管します。
(date_func2.sql)
WITH DATES(FUNCTION, RESULT) AS (
VALUES
('EPOCH', DATE_PART('EPOCH' ,NOW )),
('MILLENNIUM(S)', DATE_PART('MILLENNIUM' ,NOW )),
('CENTURY(CENTURIES)', DATE_PART('CENTURY' ,NOW )),
('DECADE(S)', DATE_PART('DECADE' ,NOW )),
('YEAR(S)', DATE_PART('YEAR' ,NOW )),
('QUARTER', DATE_PART('QUARTER' ,NOW )),
('MONTH', DATE_PART('MONTH' ,NOW )),
('WEEK', DATE_PART('WEEK' ,NOW )),
('DAY(S)', DATE_PART('DAY' ,NOW )),
('DOW', DATE_PART('DOW' ,NOW )),
('DOY', DATE_PART('DOY' ,NOW )),
('HOUR(S)', DATE_PART('HOURS' ,NOW )),
('MINUTE(S)', DATE_PART('MINUTES' ,NOW )),
('SECOND(S)', DATE_PART('SECONDS' ,NOW )),
('MILLISECOND(S)', DATE_PART('MILLISECONDS' ,NOW )),
('MICROSECOND(S)', DATE_PART('MICROSECONDS' ,NOW ))
)
SELECT * FROM DATES;
以下の通り、DATE_PART関数の引数に基づいて、current date(NOW)から日時の部分を戻してきます。
db2 -tvf date_func2.sql
FUNCTION RESULT
------------------ --------------------
EPOCH 1535118709
MILLENNIUM(S) 2
CENTURY(CENTURIES) 20
DECADE(S) 201
YEAR(S) 2018
QUARTER 3
MONTH 8
WEEK 34
DAY(S) 24
DOW 6
DOY 236
HOUR(S) 13
MINUTE(S) 51
SECOND(S) 49
MILLISECOND(S) 49787
MICROSECOND(S) 49787000
16 レコードが選択されました。
#参考資料
-
-
- 新しい組み込み集約関数およびスカラー関数
-