LoginSignup
9
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-31

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

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

参考(前回までの記事)
Db2:日付,時刻の操作を行う関数(NOW,EXTRACT)
Db2:日付,時刻の操作を行う関数(DATE_PART)

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ステートメントが現行サーバーで実行された時の読み取り値に基づくタイム・スタンプを戻しまVす。

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


参考資料

9
7
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
9
7