プログラマー必見!PostgreSQLで現在の日時を取得・操作するテクニック
PostgreSQLにおける「現在」と「現在時刻」の取得と操作
PostgreSQLでは、現在の日時を取得するための関数として、CURRENT_TIMESTAMP
とnow()
が用意されています。これらの関数は一見同じように見えますが、微妙な違いがあります。また、現在の日時を基準とした期間の計算などにも利用できます。
このチュートリアルでは、CURRENT_TIMESTAMP
とnow()
の違い、現在の日時を取得する方法、現在の日時を基準とした期間の計算方法について、わかりやすく解説します。
CURRENT_TIMESTAMP
とnow()
は、どちらも現在の日時を取得する関数ですが、以下の点で違いがあります。
トランザクションスコープ:
CURRENT_TIMESTAMP
: トランザクション開始時点の現在時刻を返します。トランザクション内で複数回呼び出しても、同じ値を返します。now()
: 呼び出すたびに現在時刻を評価し、その時点の値を返します。トランザクション内であっても、複数回呼び出すと異なる値を返す可能性があります。
互換性:
CURRENT_TIMESTAMP
: SQL標準で定義されている関数です。now()
: PostgreSQL独自の実装です。
現在の日時を取得するには、以下のいずれかの方法を使用できます。
- CURRENT_TIMESTAMPを使用する
SELECT CURRENT_TIMESTAMP;
- now()を使用する
SELECT now();
現在の日時を基準とした期間を計算するには、以下のような方法があります。
- 期間を文字列で指定する
現在の日時を起点とした1時間後の日時を取得するには、以下のように記述します。
SELECT CURRENT_TIMESTAMP + INTERVAL '1 hour';
同様に、1日前、1週間後などの日時を取得することもできます。
SELECT CURRENT_TIMESTAMP + INTERVAL '60 seconds';
同様に、1時間、1日、1週間などの期間を秒、分、時、日などの単位で指定することもできます。
その他
- PostgreSQLには、
CURRENT_DATE
、CURRENT_TIME
などの関数も用意されており、現在の日付、現在時刻のみを取得することができます。
PostgreSQLでは、CURRENT_TIMESTAMP
とnow()
という2つの関数を使用して現在の日時を取得することができます。また、現在の日時を基準とした期間を計算することもできます。これらの関数は、さまざまな場面で役立ちますので、ぜひ活用してみてください。
PostgreSQLにおける「現在」と「現在時刻」の取得と操作:サンプルコード
-- トランザクション開始時点の現在時刻を取得
BEGIN;
SELECT CURRENT_TIMESTAMP AS tran_start_time;
-- 1秒後に`CURRENT_TIMESTAMP`を呼び出す
SELECT CURRENT_TIMESTAMP AS tran_current_time;
-- トランザクションをコミット
COMMIT;
-- トランザクション開始時点と1秒後の`CURRENT_TIMESTAMP`を比較
SELECT tran_start_time, tran_current_time;
このコードを実行すると、以下の結果が得られます。
tran_start_time | tran_current_time
-----------------|------------------
2024-06-30 05:31:22 | 2024-06-30 05:31:22
トランザクション内であっても、CURRENT_TIMESTAMP
はトランザクション開始時点の現在時刻を返すことが確認できます。
-- 1秒ごとに`now()`を呼び出す
SELECT now() AS current_time;
SLEEP(1);
SELECT now() AS current_time;
SLEEP(1);
SELECT now() AS current_time;
current_time
------------------
2024-06-30 05:31:22.123456
2024-06-30 05:31:23.123456
2024-06-30 05:31:24.123456
複数回呼び出すと、異なる値を返すことが確認できます。
現在の日時を取得する
-- `CURRENT_TIMESTAMP`を使用する
SELECT CURRENT_TIMESTAMP;
-- `now()`を使用する
SELECT now();
現在の日時を基準とした期間を計算する
-- 現在の日時を起点とした1時間後の日時を取得
SELECT CURRENT_TIMESTAMP + INTERVAL '1 hour';
-- 現在の日時を起点とした1日前の日時を取得
SELECT CURRENT_TIMESTAMP - INTERVAL '1 day';
-- 現在の日時を起点とした1週間前の日時を取得
SELECT CURRENT_TIMESTAMP - INTERVAL '1 week';
-- 現在の日時を起点とした60秒後の日時を取得
SELECT CURRENT_TIMESTAMP + INTERVAL '60 seconds';
-- 現在の日時を起点とした1時間後の日時を、日本標準時(JST)に変換する
SELECT CURRENT_TIMESTAMP + INTERVAL '1 hour' AT TIME ZONE 'Asia/Tokyo';
-- 現在の日付を取得
SELECT CURRENT_DATE;
-- 現在時刻を取得
SELECT CURRENT_TIME;
これらのサンプルコードを参考に、CURRENT_TIMESTAMP
とnow()
を使いこなせるように練習してみてください。
PostgreSQLで現在の日時を取得するその他の方法
clock_timestamp()
関数は、PostgreSQL 10.0以降で使用できる関数で、現在の日時をマイクロ秒単位の精度で取得できます。この関数は、高精度な時間計測が必要な場合に役立ちます。
SELECT clock_timestamp();
statement_timestamp()
関数は、PostgreSQL 11.0以降で使用できる関数で、現在のステートメントが実行された時点の現在時刻を取得できます。トランザクションとは無関係に、ステートメントごとに異なる現在時刻を取得したい場合に役立ちます。
SELECT statement_timestamp();
SELECT transaction_timestamp();
外部ライブラリを使用する
PostgreSQLには、pg_stat_statements
拡張モジュールなどの外部ライブラリを使用して、現在の日時を取得する方法もあります。これらのライブラリは、より高度な機能を提供する場合がありますが、設定や管理が複雑になる場合があります。
システム時刻を取得する
オペレーティングシステムのシステム時刻を取得する方法もあります。ただし、この方法では、PostgreSQLサーバーのタイムゾーンとは異なるタイムゾーンで日時を取得する可能性があることに注意する必要があります。
SELECT pg_backend_pid()::text || ' | ' || to_timestamp(current_timestamp);
localtime()
とlocaltimestamp()
関数は、現在の日時を、クライアントマシンのタイムゾーンで取得します。これらの関数は、クライアントアプリケーションで現在の日時を処理する必要がある場合に役立ちます。
SELECT localtime();
SELECT localtimestamp();
date_trunc()
関数は、指定された時間単位で現在の日時を切り捨てた値を取得できます。例えば、現在の日付のみを取得するには、以下のように記述します。
SELECT date_trunc('day', now());
PostgreSQLには、現在の日時を取得する様々な方法があります。それぞれの方法には長所と短所があるため、状況に応じて適切な方法を選択する必要があります。
sql datetime postgresql