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

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

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


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



# DATE_TRUNC関数

DATE_TRUNCは、前回紹介したDATE_PART関数と同様の抽出をした後、日付、時刻、タイム・スタンプの値を指定された時間単位に切り捨てます。





```
DATE_TRUNC ( element, expression )
```

DATE_TRUNCでは、elementはEXTRACT関数と違い、クオーテーションマークで囲む必要があります。

DATE_TRUNC関数の、結果のデータ・タイプは常にBIGINT です。




| element  |説明 |
|:--------------------------------------------------|:-----------------------------------------------------|
|MILLENNIUM(S) |千年紀の最初の日|
|CENTURY(CENTURIES)        |世紀の最初の日|
|DECADE(S)          |10 年単位の最初の日 |
|YEEAR(S) |年部分   |
|QUARTER        |四半期の最初の日 |
|MONTHE          |月の最初の日|
|WEEK |週の最初の日 |
|DAY(S)        |日の初め|
|HOUR(S) |時間の初め |
|MINUTE(S)        |分の初め |
|SECOND(S)         |秒の初め |
|MILLISECOND(S) |ミリ秒の初め |
|MICROSECOND(S)        |マイクロ秒の初め|











NOW関数は、SQLステートメントが現行サーバーで実行された時の読み取り値に基づくタイム・スタンプを戻しまＶす。

NOW関数によって戻される値は、CURRENT TIMESTAMP特殊レジスターによって戻される値と同じです。
つまり、NOWはCURRENT TIMESTAMPのシノニムです。

Db2のSAMPLEデータベースに接続して、次のSQLを実行します。

```
VALUES NOW
```

```

1
--------------------------
2018-08-31-17.44.31.248000

  1 レコードが選択されました。

```




# DATE_FUNCとNOWを使ってSQLを実行してみる

Db2 11.1のSAMPLEデータベースに接続し、DATE_TRUNCとNOWを使って、日付や時刻値を抽出するSQLを実行します。

長いので、date_func3.sqlというテキストファイルにSQLを書いて保管します。

(date_func3.sql)


```
WITH DATES(FUNCTION, RESULT) AS (
  VALUES         
    ('MILLENNIUM(S)',      DATE_TRUNC('MILLENNIUM'     ,NOW )),
    ('CENTURY(CENTURIES)', DATE_TRUNC('CENTURY'        ,NOW )),    
    ('DECADE(S)',          DATE_TRUNC('DECADE'         ,NOW )),
    ('YEAR(S)',            DATE_TRUNC('YEAR'           ,NOW )),    
    ('QUARTER',            DATE_TRUNC('QUARTER'        ,NOW )),    
    ('MONTH',              DATE_TRUNC('MONTH'          ,NOW )),
    ('WEEK',               DATE_TRUNC('WEEK'           ,NOW )),
    ('DAY(S)',             DATE_TRUNC('DAY'            ,NOW )),    
    ('HOUR(S)',            DATE_TRUNC('HOURS'          ,NOW )),    
    ('MINUTE(S)',          DATE_TRUNC('MINUTES'        ,NOW )),
    ('SECOND(S)',          DATE_TRUNC('SECONDS'        ,NOW )),
    ('MILLISECOND(S)',     DATE_TRUNC('MILLISECONDS'   ,NOW ))    
  )
SELECT * FROM DATES;


```



```
db2 -tvf date_func3.sql
```

```
FUNCTION           RESULT
------------------ --------------------------
MILLENNIUM(S)      2000-01-01-00.00.00.000000
CENTURY(CENTURIES) 2000-01-01-00.00.00.000000
DECADE(S)          2010-01-01-00.00.00.000000
YEAR(S)            2018-01-01-00.00.00.000000
QUARTER            2018-07-01-00.00.00.000000
MONTH              2018-08-01-00.00.00.000000
WEEK               2018-08-27-00.00.00.000000
DAY(S)             2018-08-31-00.00.00.000000
HOUR(S)            2018-08-31-17.00.00.000000
MINUTE(S)          2018-08-31-17.45.00.000000
SECOND(S)          2018-08-31-17.45.28.000000
MILLISECOND(S)     2018-08-31-17.45.28.990000

  12 レコードが選択されました。


```








#参考資料



- [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_TRUNC スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061949.html)