Db2:日付操作で任意の日を加える(ADD_DAYS,ADD_MONTHS 他)

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)
[Db2:日付,時刻の操作を行う関数(DATE_TRUNC)](https://qiita.com/camp07/items/12ecc353d3b8acce6733)
[Db2:その月から特定の日を取り出す関数(DAYOFMONTH,FIRST_DAY,DAYS_TO_END_OF_MONTH)](https://qiita.com/camp07/items/86966b742e1f6a320985)



# 任意の日を加える関数

次の関数は、CURRENT TIMESTAMPから任意の日を加えたり減じたりします。

ADD_YEARS - 年を足す
ADD_MONTHS - 月を足す
ADD_DAYS - 日を足す
ADD_HOURS - 時間数を足す
ADD_MINUTES - 分数を足す
ADD_SECONDS - 秒数を足す


関数のフォーマットは次にようになります。


```
ADD_DAYS　( expression, numeric-expression)
```

# 任意の年、日、時などを加える

以下のSQLは、それぞれ、current dateに1単位を足します。


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

(date_add1.sql)

```
WITH DATES(FUNCTION, RESULT) AS 
 ( 
  VALUES
    ('CURRENT DATE   ',NOW),
    ('ADD_YEARS      ',ADD_YEARS(NOW,1)),
    ('ADD_MONTHS     ',ADD_MONTHS(NOW,1)),
    ('ADD_DAYS       ',ADD_DAYS(NOW,1)),
    ('ADD_HOURS      ',ADD_HOURS(NOW,1)),
    ('ADD_MINUTES    ',ADD_MINUTES(NOW,1)),
    ('ADD_SECONDS    ',ADD_SECONDS(NOW,1))
  )
SELECT * FROM DATES;
```

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



```
db2 -tvf date_add1.sql
```


本日9月14日であるため、以下の結果が戻ります。

```


FUNCTION        RESULT
--------------- --------------------------
CURRENT DATE    2018-09-14-13.06.25.921000
ADD_YEARS       2019-09-14-13.06.25.921000
ADD_MONTHS      2018-10-14-13.06.25.921000
ADD_DAYS        2018-09-15-13.06.25.921000
ADD_HOURS       2018-09-14-14.06.25.921000
ADD_MINUTES     2018-09-14-13.07.25.921000
ADD_SECONDS     2018-09-14-13.06.26.921000

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




# 任意の年、日、時などを引く

負の数値を使うことで、減算することができます。



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

(date_add2.sql)


```
WITH DATES(FUNCTION, RESULT) AS 
  ( 
  VALUES
    ('CURRENT DATE   ',NOW),
    ('ADD_YEARS      ',ADD_YEARS(NOW,-1)),
    ('ADD_MONTHS     ',ADD_MONTHS(NOW,-1)),
    ('ADD_DAYS       ',ADD_DAYS(NOW,-1)),
    ('ADD_HOURS      ',ADD_HOURS(NOW,-1)),
    ('ADD_MINUTES    ',ADD_MINUTES(NOW,-1)),
    ('ADD_SECONDS    ',ADD_SECONDS(NOW,-1))
  )
SELECT * FROM DATES;
```

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

```
db2 -tvf date_add2.sql
```



本日9月14日であるため、以下の結果が戻ります。

```

FUNCTION        RESULT
--------------- --------------------------
CURRENT DATE    2018-09-14-13.08.22.574000
ADD_YEARS       2017-09-14-13.08.22.574000
ADD_MONTHS      2018-08-14-13.08.22.574000
ADD_DAYS        2018-09-13-13.08.22.574000
ADD_HOURS       2018-09-14-12.08.22.574000
ADD_MINUTES     2018-09-14-13.07.22.574000
ADD_SECONDS     2018-09-14-13.08.21.574000

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

```



#参考資料



- [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)
        - 新しい組み込み集約関数およびスカラー関数
    - [ADD_YEARS スカラー関数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0061469.html)

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


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


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

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


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