$ man date-arith
日付の足し算・引き算
日付・時刻関数日付どうしを引くと日数、日付に整数を足すと日付。型の組合せで戻り値が変わる。
呼び出しの形
日付 - 日付 日付 + 整数 日付 - 整数 日付 + INTERVAL '1 month'
つまずきやすいところ
date - dateは整数ですが、timestamp - timestampは interval です。時刻つきの型に変えると、受け取る側が壊れます。+ 30は 30 日後であって翌月ではありません。月でずらすならINTERVAL '1 month'を使ってください。月末の扱いは製品によって違います。移植するときは月末日での挙動を必ず確かめてください。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT juchu_on, juchu_on - DATE '2025-11-01' AS nissuu, juchu_on + 30 AS sanjuu_nichi_go, (juchu_on + INTERVAL '1 month')::date AS yokugetsu FROM juchu ORDER BY juchu_on
| juchu_on | nissuu | sanjuu_nichi_go | yokugetsu |
|---|---|---|---|
| 2025-11-05 | 4 | 2025-12-05 | 2025-12-05 |
| 2025-11-18 | 17 | 2025-12-18 | 2025-12-18 |
| 2025-12-02 | 31 | 2026-01-01 | 2026-01-02 |
| 2025-12-09 | 38 | 2026-01-08 | 2026-01-09 |
| 2025-12-24 | 53 | 2026-01-23 | 2026-01-24 |
| 2026-01-07 | 67 | 2026-02-06 | 2026-02-07 |
| 2026-01-21 | 81 | 2026-02-20 | 2026-02-21 |
| 2026-02-03 | 94 | 2026-03-05 | 2026-03-03 |
10 行(うち 8 行を表示)
+ 30 は 30 日後であって翌月ではありません。
SELECT DATE '2026-01-31' + INTERVAL '1 month' AS getsumatsu_no_atsukai, DATE '2026-01-31' + 31 AS tan_ni_31_nichi_go
| getsumatsu_no_atsukai | tan_ni_31_nichi_go |
|---|---|
| 2026-02-28 | 2026-03-03 |
1 行
2 月に 31 日は無いので、月末にそろえられます。
説明
PostgreSQL では、日付は演算子でそのまま計算できます。何を足し引きするかで、返る型が変わります。
date - date… 整数(日数)date + 整数… 日付(その日数だけ後)date + INTERVAL '1 month'… timestamp(月単位でずらしたいときはこちら)timestamp - timestamp… interval(日数ではありません)
⚠️ date どうしの引き算は整数ですが、timestamp どうしだと interval になります。同じ「引き算」でも受け取る型が違うので、時刻つきの列に変えた瞬間に壊れます。
⚠️ 月の加算は日数ではできません。+ 30 は 30 日後であって「翌月」ではありません。月末の扱いも絡むので、月でずらすなら必ず INTERVAL '1 month' を使ってください。PostgreSQL は 1 月 31 日に 1 か月足すと 2 月 28 日(うるう年なら 29 日)にそろえます。
ほかの製品でも通るか
この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / IBM Db2
- SQLite では使えません(DATE 'YYYY-MM-DD' の日付リテラル)
- SQL Server では使えません(DATE 'YYYY-MM-DD' の日付リテラル)
- Oracle Database では使えません(DATE 'YYYY-MM-DD' の日付リテラル)
次に読む
使い方を順に読むなら
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: 日付/時刻関数と演算子(2026-09-02 確認)