CodeGym /コース /SQL SELF /日付データの切り捨てと丸め: DATE_TRUNC()

日付データの切り捨てと丸め: DATE_TRUNC()

SQL SELF
レベル 32, レッスン 0
使用可能

DATE_TRUNC()は、日付や時間の値を特定の単位まで切り捨てることができる強力なツールだよ。例えば、タイムスタンプを日、月、年、時間の始まりに丸めることができる。期間ごとにデータを分析したい時(例えば注文を日ごと、月ごと、年ごとにグループ化したい時)に特に役立つんだ。

日付や時間を長いテキストの文字列だと思ってみて。そこには時間、分、秒が含まれてるよね。DATE_TRUNC()はその文字列から「いらない部分」を切り落として、必要な部分だけ残してくれる。例えば:

  • 例えば2023-10-01 15:30:45という日付を日付の始まりまで切り捨てたい場合、結果は2023-10-01 00:00:00になるよ。
  • または、時間の最初の秒だけ残したい場合は2023-10-01 15:00:00になる。

構文

DATE_TRUNC()の構文はこんな感じ:

DATE_TRUNC(field, source)
  • field — どの単位まで「切り捨てる」かを指定するやつ。例えばyear、month、day、hour、minuteなど。
  • source — 切り捨てたい日付や時間の値。これはTIMESTAMP型のカラムや、NOW()みたいな関数の結果でもOK。

シンプルな使い方の例:

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- 結果: 2023-10-01 00:00:00

サポートされているフィールド

DATE_TRUNC()で使える主な時間単位はこんな感じ:

時間単位 説明
year 年の始まり(例: 2023-01-01 00:00:00)
quarter 四半期の始まり(例: 2023-07-01 00:00:00)
month 月の始まり(例: 2023-10-01 00:00:00)
week 週の始まり*(例: 2023-09-25 00:00:00)
day 日の始まり(例: 2023-10-01 00:00:00)
hour 時間の始まり(例: 2023-10-01 15:00:00)
minute 分の始まり(例: 2023-10-01 15:30:00)
second 秒の始まり(例: 2023-10-01 15:30:45)

単位が小さくなるほど、切り捨ての結果はより細かくなるよ。ちなみに、週の始まりは日曜日からだよ :)

DATE_TRUNC()の使い方例

日付の始まりまで切り捨て。 この例では、タイムスタンプを日付の始まりまで丸めるよ:

SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- 結果: 2023-10-01 00:00:00

月の始まりまで切り捨て。 今度は月の始まりまで切り捨ててみよう:

SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- 結果: 2023-10-01 00:00:00

年の始まりまで切り捨て。 年の始まりまで丸めてみると:

SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- 結果: 2023-01-01 00:00:00

現在時刻(NOW())と一緒に使う。 いつも現在の日付や時間で処理したい場合は、DATE_TRUNC()とNOW()を組み合わせて使えるよ:

SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- 結果は今の時間によって変わるよ。例: 2023-10-01 15:00:00

注文を月ごとにグループ化。 もっと実践的な例にいこう。注文のテーブルがあって、各レコードに注文日が入ってるとする。各月ごとの注文数を数えたい場合:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date TIMESTAMP NOT NULL
);

INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');

SELECT DATE_TRUNC('month', order_date) AS order_month,
       COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;

結果:

order_month total_orders
2023-08-01 00:00 2
2023-09-01 00:00 1
2023-10-01 00:00 2

実践的なユースケース

期間ごとの日付データ分析: 例えば、毎年・毎月・毎日ごとに何人のユーザーが登録したか知りたい?DATE_TRUNC()でデータをグループ化しよう。

レポート作成: タイムスタンプをうまく丸めることで、レポートがもっと見やすくなるよ。

日付や時間の比較: ミリ秒まであるような高精度なタイムスタンプでも、必要なレベルまで切り捨てれば正しく比較できる。

DATE_TRUNC()でよくあるミス

サポートされていないフィールドを使う。 例えばmillisecondはサポートされてないから、使おうとするとエラーになるよ。

データ型が違う。 DATE_TRUNC()はTIMESTAMPみたいな日付・時間型だけで動く。文字列を渡すとエラーになるから注意!

切り捨ての勘違い。 DATE_TRUNC()は必ず指定した単位の「始まり」に切り捨てるよ。もし丸めたい場合は、他のやり方を考えよう。

2
タスク
SQL SELF, レベル 32, レッスン 0
ロック未解除
月初までの日付の切り捨て
月初までの日付の切り捨て
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION