CodeGym /コース /SQL SELF /時間と日付を扱うデータ型: DATE, TIME,

時間と日付を扱うデータ型: DATE, TIME, TIMESTAMP, TIMESTAMPTZ

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

データを扱うとき、ほぼ必ず「時間」に関する何かが出てくるよね。フライトのスケジュール、注文の締切、ユーザーがサイトに登録した日付とか、全部「時間」だよ。これをうまく扱うには、ちゃんとしたツールが必要。PostgreSQLには、日付や時間の保存・処理にピッタリなデータ型が用意されてるんだ。

もちろん、"2023-10-12"みたいに日付を普通の文字列で保存することもできるけど、それはむしろ罠。文字列だと日付の比較もできないし、「3日後」とかも分からないし、タイムゾーンも全然知らない。でも、時間系のデータ型なら全部バッチリ!簡単だし、信頼できるし、速いんだ。

DATE型

DATE型はカレンダーの日付だけを保存するためのもの。具体的な時間は含まないよ。誕生日とか、年の始まりとか、日付だけでOKなときに便利。

使い方の例:

-- `DATE`型のテーブル作成例
CREATE TABLE events (
    event_name TEXT,
    event_date DATE
);

-- データ挿入
INSERT INTO events (event_name, event_date)
VALUES ('PostgreSQLカンファレンス', '2023-12-01'),
       ('誕生日', '2023-10-12');

-- データ取得
SELECT * FROM events;

結果:

event_name event_date
PostgreSQLカンファレンス 2023-12-01
誕生日 2023-10-12

TIME型

TIME型は「時間」だけを保存するよ。つまり、時・分・秒だけ。バスの時刻表とか、お店の営業時間みたいなスケジュール系にピッタリ!

例:

-- `TIME`型のテーブル作成例
CREATE TABLE schedules (
    schedule_name TEXT,
    start_time TIME,
    end_time TIME
);

-- データ挿入
INSERT INTO schedules (schedule_name, start_time, end_time)
VALUES ('勤務時間', '09:00:00', '18:00:00'),
       ('ランチ休憩', '13:00:00', '14:00:00');

-- データ取得
SELECT schedule_name, start_time, end_time FROM schedules;

結果:

schedule_name start_time end_time
勤務時間 09:00:00 18:00:00
ランチ休憩 13:00:00 14:00:00

TIMESTAMP型

TIMESTAMP型は日付と時間をセットで保存できる。でも、タイムゾーンは考慮しないから、いろんなタイムゾーンのユーザーが使う場合はちょっと注意が必要だよ。

例:

-- `TIMESTAMP`型のテーブル作成例
CREATE TABLE documents (
    document_id SERIAL PRIMARY KEY,
    created_at TIMESTAMP
);

-- データ挿入
INSERT INTO documents (created_at)
VALUES ('2023-10-12 15:30:00'),
       ('2023-12-01 08:45:15');

-- データ取得
SELECT document_id, created_at FROM documents;

結果:

document_id created_at
1 2023-10-12 15:30:00
2 2023-12-01 08:45:15

TIMESTAMPTZ型

TIMESTAMPTZ型(TZは「タイムゾーン」の意味)は、TIMESTAMPと似てるけど、タイムゾーンの情報も一緒に保存できる。世界中のユーザーが使うアプリには必須だね!

例:

-- `TIMESTAMPTZ`型のテーブル作成例
CREATE TABLE meetings (
    meeting_id SERIAL PRIMARY KEY,
    meeting_time TIMESTAMPTZ
);

-- データ挿入(PostgreSQLは現在のタイムゾーンで保存するよ)
INSERT INTO meetings (meeting_time)
VALUES ('2023-10-12 15:30:00+03'),
       ('2023-12-01 08:45:15-05');

-- データ取得
SELECT meeting_id, meeting_time FROM meetings;

結果:

meeting_id meeting_time
1 2023-10-12 15:30:00+03:00
2 2023-12-01 08:45:15-05:00

ちなみに、PostgreSQLは自動的にサーバーのタイムゾーンに合わせて時間を変換してくれるよ。

専用データ型を使うメリット

データの正確さ。 DATEやTIMESTAMPみたいな型を使えば、変なデータは入れられない。例えば、"2023-02-30"みたいな存在しない日付はNG!

扱いやすさ。 日付の比較や引き算、今の日付の取得、値の丸め(これはまた後で説明するね)も簡単!

パフォーマンス。 時間系データ型は文字列よりメモリやインデックスのサイズが小さいから、クエリも速くなるよ。

例:全部の型を使ったテーブル作成

じゃあ、イベントのスケジュールを保存するちょっと複雑なテーブルを作ってみよう。DATE、TIME、TIMESTAMP、TIMESTAMPTZを全部使うよ!

CREATE TABLE event_schedule (
    event_id SERIAL PRIMARY KEY,
    event_name TEXT NOT NULL,
    event_date DATE NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    full_start TIMESTAMP NOT NULL,
    full_start_with_zone TIMESTAMPTZ NOT NULL
);

-- データ挿入
INSERT INTO event_schedule (
    event_name, event_date, start_time, end_time, full_start, full_start_with_zone
)
VALUES
    ('朝のミートアップ', '2023-11-10', '10:00:00', '11:30:00', '2023-11-10 10:00:00', '2023-11-10 10:00:00+03'),
    ('夜のワークショップ', '2023-11-11', '18:00:00', '20:00:00', '2023-11-11 18:00:00', '2023-11-11 18:00:00+03');

-- データ確認
SELECT * FROM event_schedule;

結果:

event_id event_name event_date start_time end_time full_start fullstartwith_zone
1 朝のミートアップ 2023-11-10 10:00:00 11:30:00 2023-11-10 10:00:00 2023-11-10 10:00:00+03:00
2 夜のワークショップ 2023-11-11 18:00:00 20:00:00 2023-11-11 18:00:00 2023-11-11 18:00:00+03:00

これはスケジュール管理用のリアルなデータベース例だよ。用途によって、いろんな時間データ型を組み合わせて使えるのが分かるよね。

これでDATE、TIME、TIMESTAMP、TIMESTAMPTZの使い方を思い出せたはず!次の講義では、時間系の関数をもっと深掘りして、SQLクエリで時間データを抽出・フォーマット・管理する方法を学んでいこう!

2
タスク
SQL SELF, レベル 31, レッスン 0
ロック未解除
TIME型とTIMESTAMP型を使ったイベントスケジュール
TIME型とTIMESTAMP型を使ったイベントスケジュール
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION