Oracleで日付・時刻を扱う際に使われるTO_DATEやTO_TIMESTAMP。これらで時刻を指定したにも関わらず、実行結果に「時刻が表示されない」という経験はありませんか?
この記事では、時刻フォーマットの正しい指定方法と「時刻が表示されない理由」、そして正しく表示するための対処法まで丁寧に解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. 基本:TO_DATEとTO_TIMESTAMPとは?
| 関数名 | 説明 |
|---|---|
TO_DATE | 文字列を DATE型(日付+時刻) に変換 |
TO_TIMESTAMP | 文字列を TIMESTAMP型(高精度時刻) に変換 |
これらの関数を使うことで、文字列から日付や時刻を正確にデータ型に変換できます。
2. よく使う日付・時刻フォーマット一覧
| 書式 | 意味 | 例 |
|---|---|---|
YYYY | 西暦4桁 | 2025 |
MM | 月(01〜12) | 06 |
DD | 日(01〜31) | 15 |
HH24 | 時(24時間制) | 14 |
MI | 分 | 30 |
SS | 秒 | 45 |
FF1~FF9 | 小数点以下秒 | .123456789 |
3. よくある疑問:「時刻が表示されない!」
❓ 例:TO_DATEで時刻を指定しても…
SELECT TO_DATE('2025-06-15 14:30', 'YYYY-MM-DD HH24:MI') FROM dual;
実行結果:
TO_DATE(
---------
25-06-15
「え?14:30って指定したのに、時刻が表示されない…!」
4. 理由:NLS_DATE_FORMATの影響
OracleはDATE型を表示するときに NLS_DATE_FORMAT という設定を使います。
これがデフォルトだと、日付だけの表示になっており、時刻が表示されないのです。
🔍 現在のNLS_DATE_FORMATを確認する
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT';
✅ 例:出力が「YY-MM-DD」になっている場合
TO_DATEの内部には時刻が入っていても、表示されないのは仕様です。
5. 解決策①:TO_CHARで明示的に時刻を表示
SELECT TO_CHAR(
TO_DATE('2025-06-15 14:30', 'YYYY-MM-DD HH24:MI'),
'YYYY-MM-DD HH24:MI:SS'
) AS formatted_date
FROM dual;
出力:
FORMATTED_DATE
-------------------
2025-06-15 14:30:00
👉 表示上も、正しく「時刻」まで確認できます。
6. 解決策②:NLS_DATE_FORMATをセッションで変更
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
その後に実行:
SELECT TO_DATE('2025-06-15 14:30', 'YYYY-MM-DD HH24:MI') FROM dual;
出力:
TO_DATE('2025-06-15 14:30')
---------------------------
2025-06-15 14:30:00
👉 セッション内ではすべてのDATE型がこの形式で表示されるようになります。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
7. TO_TIMESTAMPを使う場合の注意点
SELECT TO_TIMESTAMP('2025-06-15 14:30:45.123', 'YYYY-MM-DD HH24:MI:SS.FF3') FROM dual;
ポイント:
TO_TIMESTAMPは小数秒まで扱えるが、表示も制御しないと「見えない」場合がある- → やはり
TO_CHAR(..., 'YYYY-MM-DD HH24:MI:SS.FF3')の使用が確実
8. テキスト図で理解する「見えていないだけ」
文字列:'2025-06-15 14:30'
↓ TO_DATEで変換
内部構造:2025年6月15日 14時30分00秒(保持済)
↓ 表示が 'RR-MM-DD'
出力結果:25-06-15(時刻情報が見えないだけ)
9. 実務でのポイントまとめ
| 処理目的 | おすすめ手法 |
|---|---|
| SQLで時刻も表示したい | TO_CHAR(..., 'YYYY-MM-DD HH24:MI:SS') を使う |
| セッション内の全表示統一 | ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' |
| 小数秒も扱いたい | TO_TIMESTAMP と FF 書式を併用 |
🔚 まとめ
TO_DATEやTO_TIMESTAMPは時刻情報を保持しています- しかし、表示には
NLS_DATE_FORMATの影響を強く受けます - 正確に表示させるには
TO_CHARを使うか、セッションフォーマットを変更しましょう
Oracleの開発・運用において「見えていないだけで保持されている」という性質はトラブルの元になりやすいので、今回のポイントを押さえておくことが重要です。
[参考]
SQL言語リファレンス




コメント