日期和时间函数和运算符
时间间隔运算符
操作 | 描述 | 示例 |
---|---|---|
interval * double precision → interval | 一个时间间隔乘以一个双精度数。 | real '6.1' * interval '1' second → 00:00:06.1 interval '1' second * real '6.1' → 00:00:06.1 |
interval / double precision → interval | 一个时间间隔除以一个双精度数。如果除以零,会显示错误信息。 | interval '12 days' / 4.2 → 2 days 20:34:17.143 interval '14000' / int '14' → 00:16:40 |
interval + interval → interval | 一个时间间隔加上另一个时间间隔。 | interval '20' hour + interval '10' hour → 30:00:00 |
interval - interval → interval | 一个时间间隔减去另一个时间间隔。 | interval '20' hour - interval '10' hour → 10: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' hour → 2022-03-14 01:00:00 |
timestamp - interval → timestamp | 从一个时间戳中减去一个时间间隔。 | '2022-03-14 01:00:00'::timestamp - interval '24' hour → 2022-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' + 4 → 2022-06-27 4 + Date '2022-06-23' → 2022-06-27 |
date - int → date | 从一个日期中减去天数。 | date '2022-06-23' - 4 → 2022-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' hour → 2022-03-14 01:00:00+00:00 |
timestamptz - interval → timestamptz | 从带时区的时间戳中减去固定间隔,见下方注释。 | '2022-03-14 01:00:00Z'::timestamp with time zone - interval '24' hour → 2022-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'::timestamptz → 1 day 01:00:00 |
间隔可以包含小时/分钟/秒(即固定长度),但不包含年/月/日(即可变长度)。
日期和时间函数
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_char
、to_timestamp
和 to_date
),需要使用支持的模板模式来指定格式。任何非模板模式的文本都将按原样复制。
请参阅下表,了解 RisingWave 中支持的模板模式。
模式 | 描述 |
---|---|
HH24 或 hh24 | 一天的小时数(00–23) |
HH12 或 hh12 | 一天的小时数(01–12) |
HH 或 hh | 一天的小时数(01–12) |
AM 、PM | 正午指示器(没有周期) |
am 、pm | 正午指示器(没有周期) |
MI 或 mi | 分钟(00–59) |
SS 或 ss | 秒(00–59) |
YYYY 或 yyyy | 年(4 或更多位) |
YY 或 yy | 年的最后 2 位 |
IYYY 或 iyyy | ISO 8601 周编号的年(4 或更多位) |
IY 或 iy | ISO 8601 周编号年的最后两位 |
MM 或 mm | 月份数(01–12) |
Month | 全长首字母大写月份名(空白填充为 9 字符) |
Mon | 缩写首字母大写月份名(英文 3 字符) |
DD 或 dd | 一个月里的日(01-31) |
US 或 us | 微秒(000000-999999) |
MS 或 ms | 毫秒(000-999) |
TZH:TZM 或 tzh:tzm | 带时区的小时和分钟 |
TZHTZM 或 tzhtzm | 带时区的小时和分钟 |
TZH 或 tzh | 带时区的小时。此模式仅在 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');