データを扱うとき、ほぼ必ず「時間」に関する何かが出てくるよね。フライトのスケジュール、注文の締切、ユーザーがサイトに登録した日付とか、全部「時間」だよ。これをうまく扱うには、ちゃんとしたツールが必要。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クエリで時間データを抽出・フォーマット・管理する方法を学んでいこう!
GO TO FULL VERSION