CodeGym /コース /SQL SELF /現在の日付と時刻を取得するための関数: NOW(), CURRENT_D...

現在の日付と時刻を取得するための関数: NOW(), CURRENT_DATE, CURRENT_TIME

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

PostgreSQLには、今の日時を扱うための便利な組み込み関数がいくつかあるんだ。こういう関数は、レコード作成時刻の自動記録とか、今日の日付でレポート作るとか、ある期間内にイベントが起きたかチェックしたい時なんかにめっちゃ役立つよ。ここでは、よく使う3つの関数NOW()CURRENT_DATECURRENT_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 ZONEtimestamptz)型の値を返すよ。これはSQLクエリの実行開始時点のサーバー時刻だよ。

例:

SELECT NOW();

CURRENT_TIMESTAMP — SQL標準

CURRENT_TIMESTAMPSQL標準で定義された式で、PostgreSQLでもTIMESTAMP WITH TIME ZONEを返すよ。実際、PostgreSQLではCURRENT_TIMESTAMPNOW()と同じ関数を呼び出してるんだ。

例:

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()関数を使って日付や時刻の一部を取り出す方法をやってみるよ。例えば年齢を簡単に計算したり、日・月・年ごとにデータを処理したりできるんだ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION