PostgreSQLには、今の日時を扱うための便利な組み込み関数がいくつかあるんだ。こういう関数は、レコード作成時刻の自動記録とか、今日の日付でレポート作るとか、ある期間内にイベントが起きたかチェックしたい時なんかにめっちゃ役立つよ。ここでは、よく使う3つの関数NOW()、CURRENT_DATE、CURRENT_TIMEを見ていこう。
NOW(): 現在の日付と時刻を取得する
NOW()関数は、TIMESTAMP WITH TIME ZONE形式で今の日時を返してくれる。つまり、サーバーのタイムゾーンも含めて正確な時刻が返ってくるってこと。
例:
SELECT NOW();
-- 結果: 2025-05-25 14:30:45.761523+03
この結果には、次のものが含まれてるよ:
- 日付 (
2025-05-25)、 - 時刻 (
14:30:45.761523)、 - タイムゾーン (
+03)。
もしタイムゾーンがいらないなら、明示的にTIMESTAMPにキャストできるよ:
SELECT NOW()::TIMESTAMP;
-- 結果: 2025-05-25 14:30:45.761523
CURRENT_DATE: 現在の日付を取得する
CURRENT_DATE関数は、今の日付だけを返してくれる。返り値の型はDATEだよ。
例:
SELECT CURRENT_DATE;
-- 結果: 2025-05-25
時刻がいらない場合、例えば年齢計算や日ごとのデータ集計なんかに便利だよ。
CURRENT_TIME: 現在の時刻を取得する
CURRENT_TIME関数は、TIME WITH TIME ZONE形式で今の時刻を返すよ。タイムゾーンが不要なら、TIMEにキャストしよう。
例:
SELECT CURRENT_TIME;
-- 結果: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- 結果: 14:30:45.761523
関数の使い方サンプル
これらの関数がどんな場面で役立つか、いくつか実践例を見てみよう。
レコード作成時刻の自動記録
テーブルにレコードを追加する時、作成日時を自動で保存したいことってよくあるよね。PostgreSQLなら、テーブル作成時にDEFAULT NOW()を指定すればOK。
テーブル作成例:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- レコード作成時刻
);
レコード追加:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
テーブルの中身を見てみよう:
SELECT * FROM orders;
結果:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
日付でデータを絞り込む
例えば注文テーブルがあって、今日作成された注文だけを選びたいとする。そんな時はCURRENT_DATEでフィルタリングしよう:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
ここではcreated_at::DATEで時刻を切り捨てて日付だけにしてるよ。
NOW()とCURRENT_TIMESTAMPの違い
一見するとNOW()とCURRENT_TIMESTAMPは同じことをしてるように見えるよね。実際その通り。NOW()はある標準から、CURRENT_TIMESTAMPは別の標準から来てるだけなんだ。
NOW() — PostgreSQLの関数
NOW()はPostgreSQLの組み込み関数で、TIMESTAMP WITH TIME ZONE(timestamptz)型の値を返すよ。これはSQLクエリの実行開始時点のサーバー時刻だよ。
例:
SELECT NOW();
CURRENT_TIMESTAMP — SQL標準
CURRENT_TIMESTAMPはSQL標準で定義された式で、PostgreSQLでもTIMESTAMP WITH TIME ZONEを返すよ。実際、PostgreSQLではCURRENT_TIMESTAMPもNOW()と同じ関数を呼び出してるんだ。
例:
SELECT CURRENT_TIMESTAMP;
実際に比較してみよう
SELECT NOW(), CURRENT_TIMESTAMP;
結果:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
どっちも同じ値だね。これはクエリ開始時点で計算されるからだよ。
フィルタ条件で日時関数を使う
今度は、過去7日間に作成されたレコードを選ぶクエリを書いてみよう。NOW()と日付の計算を組み合わせて使うよ:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
同じように、今月の注文だけ選びたい時はDATE_TRUNC()を使って月の始まりを切り出せる:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC()は面白い関数だから、詳しくはまた別の講義で紹介するね :P
実践的なコツ
- タイムゾーン込みの正確な時刻が欲しいなら
NOW()かCURRENT_TIMESTAMPを使おう。 - 日付だけで十分な場合(年齢計算や特定の日のイベント分析など)は
CURRENT_DATEが便利。 CURRENT_TIMEは、レポートやインターフェースで作業時間を表示したい時によく使うよ。
次の講義では、EXTRACT()やAGE()関数を使って日付や時刻の一部を取り出す方法をやってみるよ。例えば年齢を簡単に計算したり、日・月・年ごとにデータを処理したりできるんだ。
GO TO FULL VERSION