コマンド道場

$ man date-arith

日付の足し算・引き算

日付・時刻関数

日付どうしを引くと日数、日付に整数を足すと日付。型の組合せで戻り値が変わる。

呼び出しの形

日付 - 日付
日付 + 整数
日付 - 整数
日付 + INTERVAL '1 month'

つまずきやすいところ

  • date - date整数ですが、timestamp - timestampinterval です。時刻つきの型に変えると、受け取る側が壊れます。

  • + 3030 日後であって翌月ではありません。月でずらすなら 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_onnissuusanjuu_nichi_goyokugetsu
2025-11-0542025-12-052025-12-05
2025-11-18172025-12-182025-12-18
2025-12-02312026-01-012026-01-02
2025-12-09382026-01-082026-01-09
2025-12-24532026-01-232026-01-24
2026-01-07672026-02-062026-02-07
2026-01-21812026-02-202026-02-21
2026-02-03942026-03-052026-03-03

10(うち 8 行を表示)

+ 30 は 30 日後であって翌月ではありません。

月末に 1 か月足すとどうなるか
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_atsukaitan_ni_31_nichi_go
2026-02-282026-03-03

1

2 月に 31 日は無いので、月末にそろえられます。

説明

PostgreSQL では、日付は演算子でそのまま計算できます。何を足し引きするかで、返る型が変わります

  • date - date整数(日数)
  • date + 整数日付(その日数だけ後)
  • date + INTERVAL '1 month'timestamp(月単位でずらしたいときはこちら)
  • timestamp - timestampinterval(日数ではありません)

⚠️ 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' の日付リテラル

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報