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

Db2 11.1には、日付操作を行う関数についても多くの拡張があり、日付・時刻操作をSQLでより簡単に行えるようになっています。

日付・時刻操作に関して、Oracle, Netteza, PostgreSQL, MySQLなど、他のデータベース製品で使用されるSQLも簡単にDb2環境で実行できるよう、SQLの互換性がより強化されています。


参考(前回記事) [Db2:日付,時刻の操作を行う関数(NOW,EXTRACT)](https://qiita.com/camp07/items/c07c662bfbbdbad73f24)





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

```








#参考資料



- [Db2 11.1 Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.welcome.doc/doc/welcome.html)

    - [SQL の互換性の機能拡張](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.wn.doc/doc/c0054107.html)
        - 新しい組み込み集約関数およびスカラー関数
    - [NOW スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061945.html)

    - [DATE_PART スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061971.html)