コマンド道場

$ man date-trunc

DATE_TRUNC

日付・時刻関数

日付や時刻を、指定した単位で切り捨てる。月初・週初にそろえるのに使う。

呼び出しの形

DATE_TRUNC(単位, 日付)
DATE_TRUNC('month', 日付)
DATE_TRUNC('year', 日付)

つまずきやすいところ

  • PostgreSQL 固有の関数です。標準 SQL ではないので、移植には書き換えが要ります。

  • 戻り値は timestamp です。日付として扱いたいときは ::date で変換してください。

  • 'week' の週の始まりは月曜です。日曜始まりにしたい場合は自分でずらす必要があります。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

月ごとにまとめる
SELECT DATE_TRUNC('month', juchu_on)::date AS tsuki, COUNT(*) AS kensu FROM juchu GROUP BY 1 ORDER BY 1
tsukikensu
2025-11-012
2025-12-013
2026-01-012
2026-02-013

4

年月が残るので、年をまたいでも混ざりません。並べ替えもそのまま時系列になります。

年初・月初に切り捨てる
SELECT juchu_on, DATE_TRUNC('year', juchu_on)::date AS nen_hajime, DATE_TRUNC('month', juchu_on)::date AS tsuki_hajime FROM juchu ORDER BY juchu_on
juchu_onnen_hajimetsuki_hajime
2025-11-052025-01-012025-11-01
2025-11-182025-01-012025-11-01
2025-12-022025-01-012025-12-01
2025-12-092025-01-012025-12-01
2025-12-242025-01-012025-12-01
2026-01-072026-01-012026-01-01
2026-01-212026-01-012026-01-01
2026-02-032026-01-012026-02-01

10(うち 8 行を表示)

説明

DATE_TRUNC は日付を指定した単位で切り捨てます。'month' を指定すればその月の 1 日に、'year' ならその年の 1 月 1 日になります。

月別の集計では EXTRACT より扱いやすい場面が多くあります。EXTRACT(MONTH ...) は月の数字しか返さないので年をまたぐと混ざりますが、DATE_TRUNC('month', ...) は年月がそのまま残るので、そのまま GROUP BY に使えて並べ替えも自然な時系列順になります。

⚠️ DATE_TRUNCPostgreSQL の関数で、標準 SQL ではありません。MySQL では DATE_FORMAT、SQL Server では DATEFROMPARTS などで書き換えることになります。

次に読む

関係する関数

根拠にした一次情報