Cra*_*ner 3 postgresql datatypes postgresql-9.2
如何找到一个范围内包含的天数?
例如,使用这些时间戳范围,获取这些(整数)天数:
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)
Run Code Online (Sandbox Code Playgroud)
在我的挖掘中,我没有找到一个内置的函数。
是否有必要拉出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
Run Code Online (Sandbox Code Playgroud)
编辑:我已将这些函数放在 Postgresql Wiki 上,以便其他人可以在开发更高效的版本时使用或编辑它们。 https://wiki.postgresql.org/wiki/Extract_days_from_range_type