PostgreSQL INTERVAL 数据类型介绍
本文介绍在 PostgreSQL 中如何使用 INTERVAL 类型。
在 PostgreSQL 中, INTERVAL 类型用于存储时间间隔值,比如 N 年 N 月 N 日 N 时 N 分 N 秒。时间间隔不是一个时间点,而是一个时间段。
PostgreSQL INTERVAL 类型占用 16 个字节的存储空间,其取值范围从 -178000000 years 到 178000000 years。
PostgreSQL INTERVAL 语法
要定义一个 PostgreSQL INTERVAL 类型的值,请使用如下法:
@ INTERVAL [ fields ] [ (p) ]
说明:
-
@是可选的。 -
fields定义一个时间段。您可以采用以下两种输入格式:-
quantity unit [quantity unit...] [direction]其中,
quantity是一个数字,可能有符号;unit是microsecond,millisecond,second,minute,hour,day,week,month,year,decade,century,millennium中的值,或者他们的缩写或者复数形式;direction可以是ago或者空。例如:
INTERVAL '1 years 2 months 3 days 4 hours 5 minutes 6 seconds' -
ISO 8601 时间间隔格式
P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]或者
P [ years-months-days ] [ T hours:minutes:seconds ]其中,
unit您可以使用以下表中的值:缩写 含义 Y年 M月 (日期部分) W周 D天 H小时 M分钟 (时间部分) S秒 例如:
INTERVAL 'P1Y2M3DT4H5M6S' INTERVAL 'P1-2-3T4:5:6'
-
-
p是小数秒的精度。p的允许范围是从 0 到 6。
比如, interval '1 years 2 months 3 days' 意思是 1 年 2 月零 3 天。
PostgreSQL INTERVAL 输出格式
PostgreSQL INTERVAL 类型的输出格式可以被设置为 sql_standard, postgres(默认), postgres_verbose ,或 iso_8601。
您可以使用 SET intervalstyle 命令设置INTERVAL 类型的输出格式。
下面的示例展示了不同的输出格式:
以下代表 6 years 5 months 4 days 3 hours 2 minutes 1 second 四种风格中的区间:
-
sql_standardSET intervalstyle = 'sql_standard'; SELECT INTERVAL 'P1Y2M3DT4H5M6S';interval ------------------ +1-2 +3 +4:05:06 -
sql_standardSET intervalstyle = 'postgres'; SELECT INTERVAL 'P1Y2M3DT4H5M6S';interval ------------------------------- 1 year 2 mons 3 days 04:05:06 -
postgres_verboseSET intervalstyle = 'postgres_verbose'; SELECT INTERVAL 'P1Y2M3DT4H5M6S';interval ---------------------------------------------- @ 1 year 2 mons 3 days 4 hours 5 mins 6 secs -
iso_8601SET intervalstyle = 'iso_8601'; SELECT INTERVAL 'P1Y2M3DT4H5M6S';interval ---------------- P1Y2M3DT4H5M6S
PostgreSQL 区间相关的运算符和函数
算数运算
您可以将算术运算符(+ 、 -)应用于区间值,例如:
SELECT INTERVAL '1 day 12h 50m' + INTERVAL '10m';
?column?
----------------
1 day 13:00:00您可以将算术运算符(+ 、 -)应用于时间值和区间值,例如:
SELECT
current_timestamp "Now",
current_timestamp - INTERVAL '10m'
AS "Ten minutes ago";
-[ RECORD 1 ]---+------------------------------
Now | 2022-09-02 16:08:29.933843+08
Ten minutes ago | 2022-09-02 15:58:29.933843+08从 PostgreSQL 间隔中提取数据
你可以使用 date_part() 函数从一个间隔值的提取指定的字段。下面语句提取间隔值中天数、小时数和分钟数:
SELECT
date_part('day', INTERVAL '2 days 10 minutes') "day",
date_part('hour', INTERVAL '2 days 10 minutes') "hour",
date_part('minutes', INTERVAL '2 days 10 minutes') "minutes";
day | hour | minutes
-----+------+---------
2 | 0 | 10转换时间值
PostgreSQL 提供三个函数用于转换时间值:
justify_days()将超过 30 天的天数转为月数。justify_hours()将超过 24 小时的小时数转为天数。justify_interval()将超过 24 小时的小时数转为天数,并且将超过 30 天的天数转为月数。
比如:
SELECT justify_days(INTERVAL '1 year 40 days');
justify_days
----------------------
1 year 1 mon 10 daysSELECT justify_hours(INTERVAL '60 hours');
justify_hours
-----------------
2 days 12:00:00SELECT justify_interval(INTERVAL '6000 hours');
justify_interval
------------------
8 mons 10 days结论
在 PostgreSQL 中, INTERVAL 类型用于存储表示时间段的时间间隔值。