知っておけば役立つ!PostgreSQLでタイムスタンプを切り上げ・切り下げる4つの方法
PostgreSQLでタイムスタンプを切り上げ・切り下げする方法
date_trunc()
関数は、指定された日付型を指定された精度で切り捨てます。タイムスタンプを切り上げ・切り下げするには、以下のように date_part
と interval
を使用します。
切り上げ
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59') + interval '1 minute';
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59');
floor() と ceil() 関数を使う
floor()
関数は数値を切り捨て、ceil()
関数は数値を切り上げます。タイムスタンプを切り上げ・切り下げするには、以下のように extract()
関数と組み合わせて使用します。
SELECT timestamp '2024-03-27 00:37:59' + interval '1 minute' * (ceil(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0) - extract(minute from timestamp '2024-03-27 00:37:59'));
SELECT timestamp '2024-03-27 00:37:59' - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59') / 1.0 - floor(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0));
CASE
式を使って、分が30秒以上であれば切り上げ、30秒未満であれば切り下げるようにすることもできます。
SELECT CASE
WHEN extract(minute from timestamp '2024-03-27 00:37:59') >= 30
THEN timestamp '2024-03-27 00:38:00'
ELSE timestamp '2024-03-27 00:37:00'
END;
以下のサンプルコードは、上記の3つの方法をすべて試して、結果を確認するものです。
-- 1. date_trunc() 関数を使う
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59') + interval '1 minute';
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59');
-- 2. floor() と ceil() 関数を使う
SELECT timestamp '2024-03-27 00:37:59' + interval '1 minute' * (ceil(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0) - extract(minute from timestamp '2024-03-27 00:37:59'));
SELECT timestamp '2024-03-27 00:37:59' - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59') / 1.0 - floor(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0));
-- 3. CASE 式を使う
SELECT CASE
WHEN extract(minute from timestamp '2024-03-27 00:37:59') >= 30
THEN timestamp '2024-03-27 00:38:00'
ELSE timestamp '2024-03-27 00:37:00'
END;
-- PostgreSQL 14 以降
SELECT
timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles'::text,
date_trunc('minute', timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles')::text,
date_trunc('minute', timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') + interval '1 minute'::text,
date_trunc('minute', timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') - interval '1 minute'::text;
-- PostgreSQL 13 以前
SELECT
timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles'::text,
(timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles')::date::timestamp - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') / 1.0)::int + interval '1 minute'::text,
(timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles')::date::timestamp - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') / 1.0)::int::text,
(timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles')::date::timestamp - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') / 1.0)::int - interval '1 minute'::text;
2024-03-27 00:37:59
2024-03-27 00:37:00
2024-03-27 00:38:00
2024-03-27 00:36:00
このサンプルコードは、タイムゾーン America/Los_Angeles
を使用して、タイムスタンプ 2024-03-27 00:37:59
を切り上げ・切り下げます。
解説
- 最初の列は、元のタイムスタンプです。
- 2番目の列は、
date_trunc()
関数を使って切り捨てたタイムスタンプです。
PostgreSQL 14 以降では、date_trunc()
関数でタイムゾーンを直接指定できるようになりました。
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles');
PostgreSQL 13 以前では、date_trunc
関数でタイムゾーンを直接指定できません。そのため、以下のように extract()
関数と interval
を組み合わせて使用します。
(timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles')::date::timestamp - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59' AT TIME ZONE 'America/Los_Angeles') / 1.0)::int + interval '1 minute'
PostgreSQLでタイムスタンプを切り上げ・切り下げする方法
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59') + interval '1 minute';
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59');
SELECT timestamp '2024-03-27 00:37:59' + interval '1 minute' * (ceil(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0) - extract(minute from timestamp '2024-03-27 00:37:59'));
SELECT timestamp '2024-03-27 00:37:59' - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59') / 1.0 - floor(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0));
SELECT CASE
WHEN extract(minute from timestamp '2024-03-27 00:37:59') >= 30
THEN timestamp '2024-03-27 00:38:00'
ELSE timestamp '2024-03-27 00:37:00'
END;
-- 1. date_trunc() 関数を使う
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59') + interval '1 minute';
SELECT date_trunc('minute', timestamp '2024-03-27 00:37:59');
-- 2. floor() と ceil() 関数を使う
SELECT timestamp '2024-03-27 00:37:59' + interval '1 minute' * (ceil(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0) - extract(minute from timestamp '2024-03-27 00:37:59'));
SELECT timestamp '2024-03-27 00:37:59' - interval '1 minute' * (extract(minute from timestamp '2024-03-27 00:37:59') / 1.0 - floor(extract(minute from timestamp '2024-03-27 00:37:59') / 1.0));
-- 3. CASE 式を使う
SELECT CASE
WHEN extract(minute from timestamp '2024-03-27 00:37:59') >= 30
THEN timestamp '2024-03-27 00:38:00'
ELSE timestamp '2024-03-27 00:37:00'
END;
その他の方法
上記の方法以外にも、以下のような方法でタイムスタンプを切り上げ・切り下げることができます。
to_char(
postgresql