PostgreSQL: intervalを時間数に変換する4つの方法
PostgreSQLで間隔を時間数に変換する方法
EXTRACT() 関数を使う
EXTRACT()
関数は、間隔から特定の時刻要素を抽出するために使用できます。時間数に変換するには、EXTRACT(HOUR FROM interval)
を使用します。
SELECT EXTRACT(HOUR FROM interval '1 day 2 hours 3 minutes');
この例では、1 day 2 hours 3 minutes
という間隔から時間数を抽出します。結果は 26
になります。
date_part() 関数を使う
date_part()
関数は、日付または間隔から特定の時刻要素を抽出するために使用できます。時間数に変換するには、date_part('hour', interval)
を使用します。
SELECT date_part('hour', interval '1 day 2 hours 3 minutes');
単位換算を使う
間隔を時間数に変換するには、単純に単位換算を行うこともできます。1 日は 24 時間なので、以下の式で変換できます。
SELECT interval / INTERVAL '1 day' * 24;
この例では、interval
という間隔を時間数に変換します。
結合を使う
複数の間隔を時間数に変換して合計したい場合は、結合を使用できます。
SELECT SUM(hours) AS total_hours
FROM (
SELECT EXTRACT(HOUR FROM interval '1 day 2 hours 3 minutes') AS hours
UNION ALL
SELECT EXTRACT(HOUR FROM interval '1 day 1 hour 30 minutes') AS hours
) AS t;
この例では、2つの間隔を時間数に変換して合計します。結果は 57
になります。
-- 1. EXTRACT() 関数を使う
SELECT EXTRACT(HOUR FROM interval '1 day 2 hours 3 minutes');
-- 結果: 26
-- 2. date_part() 関数を使う
SELECT date_part('hour', interval '1 day 2 hours 3 minutes');
-- 結果: 26
-- 3. 単位換算を使う
SELECT interval / INTERVAL '1 day' * 24;
-- 結果: 26
-- 4. 結合を使う
SELECT SUM(hours) AS total_hours
FROM (
SELECT EXTRACT(HOUR FROM interval '1 day 2 hours 3 minutes') AS hours
UNION ALL
SELECT EXTRACT(HOUR FROM interval '1 day 1 hour 30 minutes') AS hours
) AS t;
-- 結果: 57
to_char() 関数を使う
to_char()
関数は、日付または間隔を文字列に変換するために使用できます。時間数に変換するには、to_char(interval, 'HH24')
を使用します。
SELECT to_char(interval '1 day 2 hours 3 minutes', 'HH24');
CASE 式を使う
CASE
式を使用すると、間隔の長さに応じて異なる値を返すことができます。
SELECT CASE
WHEN interval < INTERVAL '1 day' THEN EXTRACT(HOUR FROM interval)
ELSE EXTRACT(HOUR FROM interval) + 24
END AS hours
FROM table;
この例では、table
テーブルの interval
列の間隔を時間数に変換します。1 日未満の間隔はそのまま時間数に変換し、1 日以上の間隔は 24 時間を加算します。
PL/pgSQL 関数を使う
PL/pgSQL 関数を使用して、間隔を時間数に変換することもできます。
CREATE FUNCTION hours_from_interval(interval) RETURNS integer
AS
$$
DECLARE
hours integer;
BEGIN
SELECT EXTRACT(HOUR FROM interval) INTO hours;
RETURN hours;
END;
$$
LANGUAGE plpgsql;
SELECT hours_from_interval(interval '1 day 2 hours 3 minutes');
datetime postgresql intervals