範囲内に含まれる日数をどのように見つけることができますか?
たとえば、これらのタイムスタンプ範囲を使用して、次の(整数)日数を取得します。
_tstzrange('2013-10-01 07:00', '2013-10-01 07:15') | 1 (day)
tstzrange('2013-10-01 07:00', '2013-10-01 23:45') | 1 (day)
tstzrange('2013-10-01 02:00', '2013-10-02 23:45') | 2 (days)
tstzrange('2013-10-01 07:00', '2013-10-03 01:00') | 2 (days)
tstzrange('2013-10-01 01:00', '2013-10-03 23:00') | 3 (days)
tstzrange('2013-10-01 23:00', '2013-10-04 01:00') | 4 (days)
_
私が掘り下げたところ、これのための組み込み関数は見つかりませんでした。
lower()
およびupper()
タイムスタンプ要素を引き出してから、それらの間の日付間隔を取得する必要がありますか?
これを行うにはもっと良い方法があるでしょうが、tstzrange/tsrange入力パラメーターから日数または間隔を返すいくつかの関数があります。
CREATE OR REPLACE FUNCTION extract_interval(TSTZRANGE) RETURNS interval AS
$func$
select upper($1) - lower($1);
$func$ LANGUAGE sql STABLE;
CREATE OR REPLACE FUNCTION extract_interval(TSRANGE) RETURNS interval AS
$func$
select upper($1) - lower($1);
$func$ LANGUAGE sql STABLE;
CREATE OR REPLACE FUNCTION extract_days(TSTZRANGE) RETURNS integer AS
$func$
select (date_trunc('day',upper($1))::DATE - date_trunc('day',lower($1))::DATE) + 1;
$func$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION extract_days(TSRANGE) RETURNS integer AS
$func$
select (date_trunc('day',upper($1))::DATE - date_trunc('day',lower($1))::DATE) + 1;
$func$ LANGUAGE sql;
WITH tzr AS (SELECT tstzrange('2013-10-01 10:00-07', '2013-10-03 05:15-07') AS dttz, tstzrange('2013-10-01 10:00', '2013-10-03 05:15') AS dt)
SELECT extract_interval(dttz) as interval_with_tz,
extract_interval(dt) as interval_no_tz,
extract_days(dttz) as days_with_tz,
extract_days(dt) as days_no_tz
FROM tzr;
tstzrange | interval_with_tz | interval_no_tz | days_with_tz | days_no_tz
-----------------------------------------------------+------------------+----------------+--------------+------------
["2013-10-01 07:00:00-07","2013-10-01 07:15:00-07") | 00:15:00 | 00:15:00 | 1 | 1
編集:より効率的なバージョンが開発された場合に他のユーザーがそれらを使用または編集できるように、これらの関数をPostgresql Wikiに掲載しました。 https://wiki.postgresql.org/wiki/Extract_days_from_range_type