はじめに
アドベントカレンダー12/9 = 9記事目です
私が参画しているプロジェクトで SQL を使っていたとき、TRUNC(SYSDATE) という記述を見かけ、「このコードの意味はなんなのか?」と疑問になりました。
そこで調べてみた結果、「日付を扱いやすくするための便利なテクニック」だとわかったので、私と同じようにSQL初学者の方向けに今回まとめてみようと思います。
たとえば次のようなSQLコードを見たとき…
SELECT TRUNC(SYSDATE) FROM DUAL;
このコードは、“今” の日時を返す SYSDATE の値から、時間部分を切り捨て、年月日だけの “その日の 0:00(午前零時)” を返すという意味
つまり、例として「2025-11-19 14:23:45」という現在時刻情報があったとしても、TRUNC(SYSDATE) を使うと 「2025-11-19 00:00:00」 という形で取得できます
このように “日付だけ”“時刻なし” に揃えて扱うことで、日付の比較・絞り込み・集計などがシンプルかつ正確にできるようになります
TRUNC(SYSDATE) の意味と使いどころ
SYSDATE — 現在の日時を得る
-
SYSDATEは Oracle で「今この瞬間の日付と時刻」を返す関数になります - たとえば “2025-11-19 14:23:45” のように、日時(年月日+時分秒) を得る事ができます
TRUNC(date) — 時刻部分を切り捨てる
-
TRUNC(date)は、DATE 型の日付データから 時間 (時・分・秒) の情報 を切り捨ててくれる関数です - 引数に書式モデル(例えば
'MM','YYYY'など)を指定することで、「月初」「年初」などを取得することも可能 - もし書式を省略した場合(
TRUNC(SYSDATE)のように)は、日付だけを残し、時間を 00:00:00 に設定します
利用目的と利点/効果
| 利用目的 | 利点 / 効果 |
|---|---|
| 今日の日付でデータ登録、テストデータ作成 |
SYSDATE だと時間も含まれるが、TRUNC(SYSDATE) にすると「その日付の 00:00:00」で登録できる |
| 日付での絞り込みや比較(例:日単位で抽出) | 時刻の有無にかかわらず「同じ日付か」を正しく比較できる |
| 月初・年初など期間の境界取得 |
TRUNC(SYSDATE, 'MM') → 今月の1日や、TRUNC(SYSDATE, 'YYYY') → その年の1月1日などが簡単に得られる |
具体例 — SYSDATE と組み合わせて使う
たとえば:
-- 今日の日付(時刻を 00:00:00 に切り捨て)
SELECT TRUNC(SYSDATE) AS today_date
FROM DUAL;
-- 今月の月初日(その月の 1日、時刻 00:00:00)
SELECT TRUNC(SYSDATE, 'MM') AS first_of_month
FROM DUAL;
-- 今年の年初日(1月1日、時刻 00:00:00)
SELECT TRUNC(SYSDATE, 'YYYY') AS first_of_year
FROM DUAL;
どういうとき役に立つか
- 「“今日” のデータ」だけを抽出したいとき — 時刻を含めず “日付だけ” にすることで比較ミスを防げる
- 「月単位」「年単位」での集計や条件指定 — 月初/年初を簡単に取得できるので便利
- テストデータの生成や、日付ベースの判定時に“時刻のズレ”を気にせず扱いたい場合
⚠️注意点
-
TRUNC()した結果は DATE 型 なので、元の日時が TIMESTAMP 型などだった場合でも、戻り値は DATE になります。([Oracle Docs][1]) - 「時刻が不要」「日付だけでよい」ケースに限って使うのが基本。時間まで含めた比較や処理をする必要がある場合は注意。
- フォーマット指定('MM'・'YYYY' など)を使い分けることで、用途にあわせた日付取得が可能
まとめ
-
TRUNC(date)を使うと、日時データから時間部分を切り捨てて「日付だけ」にできる -
SYSDATEと組み合わせれば「今日の日付」「今月の月初」「今年の年初」などを簡単に取得できる - 日付だけで比較・絞り込み・集計したいときに非常に便利 — 特に初心者や日付処理が多いプロジェクトでは重宝する
さいごに
日付や時間を扱うとき、余計な “時刻 (時間・分・秒)” が入っていると、意図しない検索漏れやデータのズレが起きやすい事を知りました。
そして、TRUNC(SYSDATE) のように “日付だけ/時刻なし” に揃えるテクニックを使うことで、そうしたミスを防ぎ、SQL の処理を安定させることができることを学びました
今後もSQLのコードをみていて知らない事・学んだことをアウトプットできればと思います。
参考記事