LoginSignup
2
3

More than 5 years have passed since last update.

Db2:日付,時刻の操作を行う関数(DATE_PART)

Posted at

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 レコードが選択されました。

参考資料

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3