【超便利】PostgreSQLでCURRENT_TIMESTAMPを活かす!加算・減算・抽出のテクニックと応用例
PostgreSQLでCURRENT_TIMESTAMPに時間を加算する方法
INTERVAL型を使用する
最も一般的な方法は、INTERVAL
型を使用することです。INTERVAL
型は、期間を表すデータ型で、以下のような書式で指定できます。
INTERVAL 'quantity' unit
quantity
:加算する時間の長さunit
:時間単位(例えば、'MINUTE' は分、'HOUR' は時間)
例:現在時刻に30分を加算するには、以下のように記述します。
SELECT CURRENT_TIMESTAMP + INTERVAL '30 MINUTE';
DATE_ADD
関数を使用して、現在時刻に時間を加算することもできます。この関数は、以下の引数を取ります。
interval
:加算する期間(INTERVAL
型で指定)timestamp
:加算対象の時刻(省略可能。省略した場合、現在時刻が使用されます)
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL '30 MINUTE');
PostgreSQL 11以降では、WITH
オプションを使用して、クエリ内で変数に値を代入することができます。この機能を使用して、現在時刻を変数に代入し、その変数に時間を加算することができます。
例:現在時刻を current_time
変数に代入し、30分を加算するには、以下のように記述します。
WITH current_time AS (
SELECT CURRENT_TIMESTAMP
)
SELECT current_time + INTERVAL '30 MINUTE';
注意点
- 上記のいずれの方法を使用する場合でも、結果のデータ型は
TIMESTAMP
となります。 - 時間に加算するだけでなく、減算することもできます。減算する場合は、
-
記号を使用します。 - PostgreSQLには、ここで説明した以外にも、日付と時刻を操作するための様々な関数と演算子が用意されています。詳細は、PostgreSQLのマニュアルを参照してください。
PostgreSQLでCURRENT_TIMESTAMPに時間を加算するサンプルコード
INTERVAL型を使用する
-- 現在時刻に30分を加算
SELECT CURRENT_TIMESTAMP + INTERVAL '30 MINUTE';
-- 現在時刻から1時間30分を減算
SELECT CURRENT_TIMESTAMP - INTERVAL '1 HOUR 30 MINUTE';
-- 現在時刻に1日5時間10分を加算
SELECT CURRENT_TIMESTAMP + INTERVAL '1 DAY 5 HOURS 10 MINUTE';
DATE_ADD関数を使用する
-- 現在時刻に30分を加算
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL '30 MINUTE');
-- 現在時刻から1時間30分を減算
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL '-1 HOUR 30 MINUTE');
-- 現在時刻に1日5時間10分を加算
SELECT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL '1 DAY 5 HOURS 10 MINUTE');
PostgreSQL 11以降のWITHオプションを使用する
-- 現在時刻をcurrent_time変数に代入
WITH current_time AS (
SELECT CURRENT_TIMESTAMP
)
-- current_time変数に30分を加算
SELECT current_time + INTERVAL '30 MINUTE';
-- current_time変数から1時間30分を減算
SELECT current_time - INTERVAL '1 HOUR 30 MINUTE';
-- current_time変数に1日5時間10分を加算
SELECT current_time + INTERVAL '1 DAY 5 HOURS 10 MINUTE';
上記のサンプルコードは、PostgreSQLでCURRENT_TIMESTAMPに時間を加算する方法を3通り示しています。
- INTERVAL型を使用する:これは最も一般的な方法で、
INTERVAL
型を使用して加算する時間の長さと単位を指定します。 - DATE_ADD関数を使用する:
DATE_ADD
関数は、加算する期間と加算対象の時刻を指定して使用できます。
補足
- サンプルコードでは、加算する時間の長さを整数で指定していますが、小数点を含む値も指定できます。
PostgreSQLでCURRENT_TIMESTAMPに時間を加算するその他の方法
EXTRACT関数とCASE式を使用する
この方法は、加算する時間の長さをあらかじめ変数に代入しておき、EXTRACT
関数とCASE
式を使用して、CURRENT_TIMESTAMPから必要な時間成分を抽出 and 加算する方法です。
-- 加算する時間 (分単位) を変数に代入
SET add_minutes = 30;
-- 現在時刻から分を抽出
SELECT
CURRENT_TIMESTAMP,
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS current_minute
FROM DUAL;
-- CASE式を使用して、現在の分にadd_minutesを加算
SELECT
CURRENT_TIMESTAMP,
CASE
WHEN EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) + add_minutes > 60 THEN
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) + add_minutes - 60
|| ' HOUR'
ELSE
EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) + add_minutes
|| ' MINUTE'
END AS result
FROM DUAL;
CONCAT関数とSUBSTRING関数を使用する
この方法は、CONCAT
関数を使用してCURRENT_TIMESTAMP文字列に時間を加算する方法です。その後、SUBSTRING
関数を使用して、必要な時間形式の文字列を抽出します。
-- 加算する時間 (秒単位) を変数に代入
SET add_seconds = 1800;
-- 現在時刻を文字列に変換
SELECT CONCAT(to_char(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS'), '::timestamp') AS current_timestamp_str;
-- CONCATを使用して、add_secondsを文字列に追加
SELECT
current_timestamp_str,
CONCAT(current_timestamp_str, ' + INTERVAL ', interval 'cast(' || add_seconds || ' AS second)') AS result_str
FROM DUAL;
-- SUBSTRINGを使用して、必要な時間形式の文字列を抽出
SELECT
SUBSTRING(result_str FROM 1 FOR 19) AS result_timestamp
FROM DUAL;
pg_timezone.interval_add関数を使用する
PostgreSQL 10以降では、pg_timezone
拡張モジュールを使用して、pg_timezone.interval_add
関数を使用することができます。この関数は、INTERVAL
型とTIMESTAMP
型を引数として取り、加算結果をTIMESTAMP
型で返します。
-- 加算する時間 (分単位) を変数に代入
SET add_minutes = 30;
-- pg_timezone.interval_add関数を使用して、CURRENT_TIMESTAMPにadd_minutesを加算
SELECT pg_timezone.interval_add(CURRENT_TIMESTAMP, interval 'cast(' || add_minutes || ' AS minute')') AS result;
- 上記の方法は、いずれも状況に応じて使用できますが、複雑さや可読性などの点で、前述の方法よりも劣る場合があります。
postgresql