Oracle日時データ操作完全マスター:ROUND関数とTRUNC関数の活用ガイド

Oracle Master Silver

Oracleデータベースで日時データを操作する際、ROUND関数とTRUNC関数は必須のツールです。この2つを適切に使い分けることで、精密なデータ処理や効率的な分析が可能になります。

本記事では、これらの関数の基本的な使い方から、実務での活用方法、さらに初心者がつまづきがちなポイントや注意点までを網羅的に解説します。


ROUND関数:日時データを「四捨五入」する

ROUND関数の概要

ROUND関数は、日時データを指定された単位で四捨五入します。四捨五入することで、データの分析や集計が簡単になり、精度を高めることができます。

構文

ROUND(date, format)
  • date: 操作対象の日時データ
  • format: 四捨五入の基準(省略可能)

フォーマット指定

フォーマット説明使用例
'YYYY'年単位で四捨五入6月以降なら翌年に繰り上げ
'MM'月単位で四捨五入16日以降なら翌月に繰り上げ
'DD'日単位(デフォルト)で四捨五入午後12時以降なら翌日に繰り上げ
'HH'時単位で四捨五入30分以降なら翌時間に繰り上げ
'MI'分単位で四捨五入30秒以降なら翌分に繰り上げ

使用例

  1. 現在日時を月単位で四捨五入
SELECT ROUND(SYSDATE, 'MM') AS rounded_date FROM dual;
  1. 特定の日時を時単位で四捨五入
SELECT ROUND(TO_DATE('2024-12-15 14:35', 'YYYY-MM-DD HH24:MI'), 'HH') AS rounded_date FROM dual;

実務での応用

  • 四半期ごとの売上分析では、日付を月単位または年単位で四捨五入することで簡単に集計が可能になります。

TRUNC関数:日時データを「切り捨て」る

TRUNC関数の概要

TRUNC関数は、日時データを指定された単位で切り捨てます。切り捨てによって基準点を固定できるため、集計やフィルタリングに非常に役立ちます。

構文

TRUNC(date, format)
  • date: 操作対象の日時データ
  • format: 切り捨ての基準(省略可能)

フォーマット指定

フォーマット説明使用例
'YYYY'年単位で切り捨てその年の1月1日に切り捨て
'MM'月単位で切り捨てその月の1日に切り捨て
'DD'日単位(デフォルト)で切り捨て時刻部分を切り捨て
'HH'時単位で切り捨て分以下を切り捨て
'MI'分単位で切り捨て秒以下を切り捨て

使用例

  1. 現在日時を日単位で切り捨て
SELECT TRUNC(SYSDATE, 'DD') AS truncated_date FROM dual;
  1. 特定の日時を月単位で切り捨て
SELECT TRUNC(TO_DATE('2024-12-15 14:35', 'YYYY-MM-DD HH24:MI'), 'MM') AS truncated_date FROM dual;

実務での応用

  • 月初日や年初日を基準にしたデータのフィルタリングや集計に活用できます。

ROUND関数とTRUNC関数の違いを徹底比較

以下の例で、ROUND関数とTRUNC関数の動作の違いを確認します。

SELECT 
ROUND(TO_DATE('2024-12-15 14:35', 'YYYY-MM-DD HH24:MI'), 'HH') AS rounded_date,
TRUNC(TO_DATE('2024-12-15 14:35', 'YYYY-MM-DD HH24:MI'), 'HH') AS truncated_date
FROM dual;

結果

ROUND結果TRUNC結果
2024-12-15 15:00:002024-12-15 14:00:00

解説

  • ROUND: 指定単位で四捨五入(例: 14:35 → 15:00)。
  • TRUNC: 指定単位で切り捨て(例: 14:35 → 14:00)。

ROUND/TRUNC関数の実務的応用

1. 月初日と月末日を取得

  • 月初日を取得
SELECT TRUNC(SYSDATE, 'MM') AS first_day_of_month FROM dual;
  • 月末日を取得
SELECT TRUNC(ADD_MONTHS(SYSDATE, 1), 'MM') - 1 AS last_day_of_month FROM dual;

2. 時間帯別の売上集計

SELECT TRUNC(order_date, 'HH') AS order_hour, COUNT(*) AS order_count
FROM orders
GROUP BY TRUNC(order_date, 'HH');

3. 年齢を計算

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('1990-06-15', 'YYYY-MM-DD')) / 12) AS age FROM dual;

4. 四半期ごとの売上データを分析

SELECT TRUNC(order_date, 'Q') AS quarter_start, SUM(amount) AS total_sales
FROM sales
GROUP BY TRUNC(order_date, 'Q');

注意点とベストプラクティス

  1. フォーマットの指定を忘れない
    フォーマットを指定しない場合、デフォルトで'DD'が適用されます。
  2. 目的に応じた使い分けを徹底する
    • 四捨五入が必要ならROUND
    • 基準点を固定したいならTRUNC
  3. パフォーマンスへの配慮
    関数を使うことでインデックスが無効になる場合があります。特に大規模データセットでは注意が必要です。

まとめ:使い分けが成功の鍵

関数主な用途具体例
ROUND日時データを精度よく丸めたいとき時間帯ごとの平均を計算
TRUNC基準日時を厳密に保持したいとき集計データの基準点を設定

これらの関数を習得することで、日時データの操作が飛躍的に効率化され、精度の高い分析が可能になります。ぜひ、この記事で学んだ知識を実務に活かしてください!

[参考]
Oracle Database SQL言語リファレンス 19c

コメント

タイトルとURLをコピーしました