间隔数据类型和文字 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

间隔数据类型和文字

您可以使用间隔数据类型以 secondsminuteshoursdaysmonths、和 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_qualifierday_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

还支持每个单位的缩写和复数。例如,5s5 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