Skip to main content

日期和时间函数和运算符

时间间隔运算符

操作描述示例
interval * double precision → interval一个时间间隔乘以一个双精度数。real '6.1' * interval '1' second00:00:06.1
interval '1' second * real '6.1'00:00:06.1
interval / double precision → interval一个时间间隔除以一个双精度数。如果除以零,会显示错误信息。interval '12 days' / 4.22 days 20:34:17.143
interval '14000' / int '14'00:16:40
interval + interval → interval一个时间间隔加上另一个时间间隔。interval '20' hour + interval '10' hour30:00:00
interval - interval → interval一个时间间隔减去另一个时间间隔。interval '20' hour - interval '10' hour10:00:00
time + interval → time一个时间加上一个时间间隔。time '18:20:49' + interval '1 hour'19:20:49
time - interval → time一个时间减去一个时间间隔。time '18:20:49' - interval '2 hours'16:20:49
time - time → interval一个时间减去另一个时间。time '18:20:49' - time '16:07:16'02:13:33

偏移运算符

操作描述示例
timestamp + interval → timestamp将一个时间间隔加到一个时间戳上。'2022-03-13 01:00:00'::timestamp + interval '24' hour2022-03-14 01:00:00
timestamp - interval → timestamp从一个时间戳中减去一个时间间隔。'2022-03-14 01:00:00'::timestamp - interval '24' hour2022-03-13 01:00:00
timestamp - timestamp → interval从一个时间戳中减去另一个时间戳。'2022-03-13 03:00:00'::timestamp - '2022-03-13 01:00:00'02:00:00
date + int → date将天数加到一个日期上。date '2022-06-23' + 42022-06-27
4 + Date '2022-06-23'2022-06-27
date - int → date从一个日期中减去天数。date '2022-06-23' - 42022-06-19
date - date → int从一个日期中减去另一个日期。date '2020-03-01' - '2020-02-01'29
date + interval → timestamp将一个时间间隔加到一个日期上。date '2022-04-08' + interval '10 hour'2022-04-08 10:00:00
date - interval → timestamp从一个日期中减去一个时间间隔。date '2022-04-08' - interval '10 hour'2022-04-07 14:00:00
date + time → timestamp将一个时间加到一个日期上。date '2022-06-23' + time '19:24:00'2022-06-23 19:24:00
time '19:24:00' + date '2022-06-23'2022-06-23 19:24:00

带时区运算符的时间戳

操作描述示例
timestamp AT TIME ZONE time_zone → timestamptz

timestamptz AT TIME ZONE time_zone → timestamp
将时间从时间戳转换为带时区的时间戳或从带时区的时间戳转换为时间戳。不支持夏令时前调期间的无效本地时间。夏令时后调期间的模糊本地时间可解释为转换后的时间。'2021-12-31 16:00:00'::timestamp AT TIME ZONE 'us/pacific'2022-01-01 00:00:00+00:00

'2022-01-01 00:00:00Z'::timestamptz AT TIME ZONE 'us/pacific'2021-12-31 16:00:00
timestamptz + interval → timestamptz将固定时间间隔加到带时区的时间戳上。见下方注释。'2022-03-13 01:00:00Z'::timestamp with time zone + interval '24' hour2022-03-14 01:00:00+00:00
timestamptz - interval → timestamptz从带时区的时间戳中减去固定间隔,见下方注释。'2022-03-14 01:00:00Z'::timestamp with time zone - interval '24' hour2022-03-13 01:00:00+00:00
timestamptz - timestamptz → interval从带时区的时间戳中减去带时区的时间戳,并将 24 小时的间隔转换为天数。'2023-07-30 13:22:00-05:00'::timestamptz - '2023-07-29 13:22:00-04:00'::timestamptz1 day 01:00:00
note

间隔可以包含小时/分钟/秒(即固定长度),但不包含年/月/日(即可变长度)。

日期和时间函数

current_timestamp

可返回当前日期和时间。

句法
current_timestamp() → *timestamptz*
示例
current_timestamp()`2023-09-06 07:06:46.724+00:00`

date_part

可提取日期或时间戳的值。

句法
date_part ( precision_string, date/time_value[, time_zone ] ) → double_precision

precision_string 可以是 year、month、day、hour、minute、second、doy、dow、millisecond、microsecond、epoch、millennium、century、decade、isoyear、quarter、week、isodow 或 julian。

date/time_value 可以是日期、时间戳、时间、带时区的时间戳或间隔。

如果 date/time_value 是带时区的时间戳,则建议同时指定 time_zone,否则 time_zone 将默认为会话时区。

由于 date_part() 返回 double precision 类型的值,可能会导致精度损失;因此,建议使用 extract()

示例
date_part('day', date '2022-04-07')7

date_part('hour', timestamp '2022-04-07 22:00:30')22

date_part('second', time '22:00:30.123')30.123

date_part('day', interval '2 days')2

date_part('day', '2023-06-01 00:00:00Z'::timestamptz, 'Australia/Sydney')1

date_trunc

可将 date/time_value 截断为指定的 precision_string

句法
date_trunc ( precision_string, date/time_value[, time_zone ] ) → date/time_value

precision_string 可以是 microseconds、milliseconds、second、minute、hour、day、week、month、quarter、year、decade、century 或 millennium。

date/time_value 可以是时间戳、timestamptz(带时区的时间戳)或间隔。

如果 date/time_value 是带时区的时间戳,则建议同时指定 time_zone,否则 time_zone 将默认为会话时区。

precision_string 值 'week' 不支持间隔。

示例
date_trunc('hour', timestamp '2202-02-16 20:38:40.123456')2202-02-16 20:00:00

date_trunc('day', timestamp with time zone '2202-02-16 20:38:40.123456Z', 'Australia/Sydney')2202-02-16 13:00:00+00:00

date_trunc('month', interval '2333 year 4 months 5 days 02:47:33.123')2333 years 4 mons

extract

该函数有两个变体。

extract ( field from source )

可提取日期或时间戳的值。

句法
extract ( field from source [AT TIME ZONE time_zone]) → numeric

field 可以是 year、month、day、hour、minute、second、doy、dow、millisecond、microsecond、epoch、millennium、century、decade、isoyear、quarter、week、isodow 或 julian。

source 可以是日期、时间戳、带时区的时间戳、时间或间隔。

如果指定了 time_zone,则 source 应为带有时区的 timestamptz 类型。

示例
extract(day from date '2022-04-07')7

extract(hour from timestamp '2022-04-07 22:00:30')22

extract(second from time '22:00:30.123')30.123000

extract(day from interval '2 days')2

extract(day from '2023-06-01 00:00:00Z'::timestamptz at time zone 'us/pacific')31

extract( epoch )

可将带有时区的时间戳的值转换为 Unix 纪元秒(自1970-01-01 00:00:00 UTC 起的秒数)。之前的时间戳为负值。

句法
extract ( epoch FROM timestamp_with_time_zone ) → seconds_numeric
示例
extract(epoch from '2010-01-01 12:34:56.789012Z'::timestamp with time zone)1262349296.789012

now

可返回当前日期和时间。对于流查询,now() 只能在 WHERE、HAVING 和 ON 子句中使用。有关更多信息,请参阅时间滤波器。此约束不适用于批查询。

句法
now() → timestamptz
示例
now()'2023-08-04 21:29:59.662+00:00'

proctime

可返回处理数据时的带时区的系统时间。可以使用此函数指定表或 source 中数据的处理时间。

句法
proctime() → timestamptz
示例
CREATE TABLE t1 (v1 int, proc_time timestamptz as proctime());

to_char

可根据给定的格式将输入转换为字符串。大小写均支持。

句法
to_char ( timestamptz, format ) → *string*
to_char ( timestamp, format ) → *string*
to_char ( interval, format ) → *string*
示例

to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS')'05:31:12'

to_char('2023-07-11 20:01:00-07:00'::timestamptz, 'HH12:MI:SS TZH:TZM') → 03:01:00 +00:00

to_char('1year 2 month 3day 4hour 5minute 6second'::interval, 'YYYY MM DD PM HH12 HH24 MI SS MS US') → 0001 02 03 AM 04 04 05 06 000 000000

to_date

可根据给定的格式将字符串转换为日期。

句法
to_date ( date_string, format )date
示例
to_date('05 Dec 2000', 'DD Mon YYYY')'2000-12-05'

to_timestamp

该函数有两个变体。

to_timestamp ( seconds_double_precision )

可将 Unix 纪元秒(自1970-01-01 00:00:00+00 起的秒数)转换为带时区的时间戳。

句法
to_timestamp ( seconds_double_precision ) → timestamptz
示例
to_timestamp(1262349296.7890123)'2010-01-01 12:34:56.789012+00:00'

to_timestamp ( string, timestamp_format )

可根据给定的格式将字符串转换为带时区的时间戳。

句法
to_timestamp ( string, timestamp_format ) → timestamptz
示例
to_timestamp('2022 12 25', 'YYYY MM DD')'2022-12-25 00:00:00+00:00'

to_timestamp('2022-12-25 00:00:00.900006', 'YYYY-MM-DD HH24:MI:SS.US')'2022-12-25 00:00:00.900006+00:00'

to_timestamp('2022-12-25 00:00:00.906', 'YYYY-MM-DD HH24:MI:SS.MS')'2022-12-25 00:00:00.906+00:00'

to_timestamp('2023-07-11 20:01:00-07:00', 'YYYY-MM-DD HH24:MI:SSTZH:TZM')'2023-07-12 03:01:00+00:00'

日期/时间格式化的模板模式

对于日期和时间格式化函数(如 to_charto_timestampto_date),需要使用支持的模板模式来指定格式。任何非模板模式的文本都将按原样复制。

请参阅下表,了解 RisingWave 中支持的模板模式。

模式描述
HH24hh24一天的小时数(00–23)
HH12hh12一天的小时数(01–12)
HHhh一天的小时数(01–12)
AMPM正午指示器(没有周期)
ampm正午指示器(没有周期)
MImi分钟(00–59)
SSss秒(00–59)
YYYYyyyy年(4 或更多位)
YYyy年的最后 2 位
IYYYiyyyISO 8601 周编号的年(4 或更多位)
IYiyISO 8601 周编号年的最后两位
MMmm月份数(01–12)
Month全长首字母大写月份名(空白填充为 9 字符)
Mon缩写首字母大写月份名(英文 3 字符)
DDdd一个月里的日(01-31)
USus微秒(000000-999999)
MSms毫秒(000-999)
TZH:TZMtzh:tzm带时区的小时和分钟
TZHTZMtzhtzm带时区的小时和分钟
TZHtzh带时区的小时。此模式仅在 to_timestamp 中有效。

延迟执行函数

以下函数可用于延迟执行当前会话进程。

pg_sleep

pg_sleep() 函数可使当前会话的进程休眠给定的秒数以后再执行。可以指定带小数的秒数。

句法
pg_sleep ( double precision )
示例
SELECT pg_sleep(1.5);

pg_sleep_for

pg_sleep_for 是一个便利函数,允许将休眠时间指定为间隔。

句法
pg_sleep_for ( interval )
示例
SELECT pg_sleep_for('5 minutes');