间隔数据类型和文字
您可以使用间隔数据类型以 seconds
、minutes
、hours
、days
、months
、和 years
等为单位存储时间段。间隔数据类型和文字可用于日期时间计算,例如在日期和时间戳中添加间隔、对间隔求和以及从日期或时间戳中减去间隔。间隔文字可用作表中间隔数据类型列的输入值。
间隔数据类型的语法
指定间隔数据类型以存储以年和月为单位的持续时间:
INTERVAL year_to_month_qualifier
指定间隔数据类型以存储以天、小时、分钟和秒为单位的持续时间:
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
间隔文字的语法
指定间隔文字以定义以年和月为单位的持续时间:
INTERVAL quoted-string year_to_month_qualifier
指定间隔文字以定义以天、小时、分钟和秒为单位的持续时间:
INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]
参数
- 引用字符串
-
指定正数值或负数值,以指定数量和日期时间单位作为输入字符串。如果引用字符串仅包含数字,Amazon Redshift 将根据 year_to_month_qualifier 或 day_to_second_qualifier 确定单位。例如,
'23' MONTH
表示1 year 11 months
、'-2' DAY
表示-2 days 0 hours 0 minutes 0.0 seconds
,'1-2' MONTH
表示1 year 2 months
、'13 day 1 hour 1 minute 1.123 seconds' SECOND
表示13 days 1 hour 1 minute 1.123 seconds
。有关间隔输出格式的更多信息,请参阅间隔样式。 - year_to_month_qualifier
-
指定间隔的范围。如果您使用限定词并创建时间单位小于限定词的间隔,Amazon Redshift 会截断并丢弃间隔中较小的部分。year_to_month_qualifier 的有效值为:
YEAR
MONTH
YEAR TO MONTH
- day_to_second_qualifier
-
指定间隔的范围。如果您使用限定词并创建时间单位小于限定词的间隔,Amazon Redshift 会截断并丢弃间隔中较小的部分。day_to_second_qualifier 的有效值为:
DAY
HOUR
MINUTE
SECOND
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND
INTERVAL 文字的输出会被截断为指定的最小 INTERVAL 分量。例如,在使用 MINUTE 限定词时,Amazon Redshift 会丢弃小于 MINUTE 的时间单位。
select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE
结果值被截断为
'1 day 01:01:00'
。 - fractional_precision
-
可选参数,用于指定间隔中允许的小数位数。仅在间隔包含 SECOND 时,才应指定 fractional_precision 参数。例如,
SECOND(3)
创建的间隔仅允许三个小数位,例如 1.234 秒。最大小数位数为六位。
会话配置 interval_forbid_composite_literals
确定在同时指定 YEAR TO MONTH 和 DAY TO SECOND 部分的间隔时是否返回错误。有关更多信息,请参阅 interval_forbid_composite_literals。
间隔算术
您可以将间隔值与其他日期时间值一起使用来执行算术运算。下表描述了可用的操作以及每项操作产生的数据类型。例如,在将 interval
添加 date
时,如果是 YEAR TO MONTH 间隔,则结果为 date
;如果是 DAY TO SECOND 间隔,则结果为时间戳。
Date | Timestamp | Interval | 数值 | ||
---|---|---|---|---|---|
Interval | - | 不适用 | 不适用 | Interval | 不适用 |
+ | Date | 日期/时间戳 | Interval | 不适用 | |
* | 不适用 | 不适用 | 不适用 | Interval | |
/ | 不适用 | 不适用 | 不适用 | Interval | |
日期 | - | 数值 | Interval | 日期/时间戳 | Date |
+ | 不适用 | 不适用 | 不适用 | 不适用 | |
Timestamp | - | Interval | Interval | Timestamp | Timestamp |
+ | 不适用 | 不适用 | 不适用 | 不适用 |
间隔样式
您可以使用 SQL SET 命令更改间隔值的输出显示格式。在 SQL 中使用间隔数据类型时,将其转换为文本可以查看预期的间隔风格,例如 YEAR TO MONTH::text
。用于设置 IntervalStyle
值的可用值包括:
postgres
– 遵循 PostgreSQL 风格。这是默认模式。postgres_verbose
– 遵循 PostgreSQL 的详细风格。sql_standard
– 遵循 SQL 标准间隔文字风格。
以下命令将间隔风格设置为 sql_standard
。
SET IntervalStyle to 'sql_standard';
postgres 输出格式
以下是 postgres
间隔风格的输出格式。每个数值都可以是负数。
'<numeric> <unit> [, <numeric> <unit> ...]'
select INTERVAL '1-2' YEAR TO MONTH::text
varchar --------------- 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar ------------------ 1 day 02:03:04.5678
postgres_verbose 输出格式
postgres_verbose 语法与 postgres 类似,但是 postgres_verbose 输出还包含时间单位。
'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
select INTERVAL '1-2' YEAR TO MONTH::text
varchar ----------------- @ 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar --------------------------- @ 1 day 2 hours 3 mins 4.56 secs
sql_standard 输出格式
年至月间隔值的格式如下所示。在间隔之前指定负数表示间隔为负值,适用于整个间隔。
'[-]yy-mm'
日至秒值间隔的格式如下所示。
'[-]dd hh:mm:ss.ffffff'
SELECT INTERVAL '1-2' YEAR TO MONTH::text
varchar ------- 1-2
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar --------------- 1 2:03:04.5678
间隔数据类型示例
以下示例演示如何将 INTERVAL 数据类型与表结合使用。
create table sample_intervals (y2m interval month, h2m interval hour to minute); insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second); select y2m::text, h2m::text from sample_intervals;
y2m | h2m ---------------+----------------- 1 year 8 mons | 2 days 01:01:00
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month; select * from sample_intervals;
y2m | h2m ---------+----------------- 2 years | 2 days 01:01:00
delete from sample_intervals where h2m = interval '2 1:1:0' day to second; select * from sample_intervals;
y2m | h2m -----+-----
间隔文字示例
以下示例在间隔风格设置为 postgres
的情况下运行。
以下示例演示如何创建间隔为 1 年的 INTERVAL 文字。
select INTERVAL '1' YEAR
intervaly2m --------------- 1 years 0 mons
如果您指定的引用字符串超过限定词,则剩余的时间单位将从间隔处截断。在以下示例中,13 个月的间隔变为 1 年零 1 个月,但由于使用 YEAR 限定词,剩余的 1 个月被排除在外。
select INTERVAL '13 months' YEAR
intervaly2m --------------- 1 years 0 mons
如果您使用的限定词小于间隔字符串,则会包括排除的单位。
select INTERVAL '13 months' MONTH
intervaly2m --------------- 1 years 1 mons
在间隔中指定精度会将小数位数截断为指定的精度。
select INTERVAL '1.234567' SECOND (3)
intervald2s -------------------------------- 0 days 0 hours 0 mins 1.235 secs
如果您未指定精度,Amazon Redshift 将使用最大精度 6。
select INTERVAL '1.23456789' SECOND
intervald2s ----------------------------------- 0 days 0 hours 0 mins 1.234567 secs
以下示例演示如何创建范围间隔。
select INTERVAL '2:2' MINUTE TO SECOND
intervald2s ------------------------------ 0 days 0 hours 2 mins 2.0 secs
限定词决定了您要指定的单位。例如,尽管以下示例使用与前一个示例相同的“2:2”引用字符串,但 Amazon Redshift 仍会识别出它由于限定词而使用了不同的时间单位。
select INTERVAL '2:2' HOUR TO MINUTE
intervald2s ------------------------------ 0 days 2 hours 2 mins 0.0 secs
还支持每个单位的缩写和复数。例如,5s
、5 second
、和 5 seconds
是等效间隔。支持的单位为年、月、小时、分钟和秒。
select INTERVAL '5s' SECOND
intervald2s ------------------------------ 0 days 0 hours 0 mins 5.0 secs
select INTERVAL '5 HOURS' HOUR
intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs
select INTERVAL '5 h' HOUR
intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs