时间戳函数
本节介绍用于检查和操作 TIMESTAMP 值的函数和运算符。
另请参阅相关的 TIMESTAMPTZ 函数。
时间戳运算符
下表展示了 TIMESTAMP 类型可用的数学运算符。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
+ | 与 INTERVAL 相加 | TIMESTAMP '1992-03-22 01:02:03' + INTERVAL 5 DAY | 1992-03-27 01:02:03 |
- | TIMESTAMP 相减 | TIMESTAMP '1992-03-27' - TIMESTAMP '1992-03-22' | 5 days |
- | 减去 INTERVAL | TIMESTAMP '1992-03-27 01:02:03' - INTERVAL 5 DAY | 1992-03-22 01:02:03 |
对无穷值进行加减运算会得到相同的无穷值。
标量时间戳函数
下表展示了 TIMESTAMP 值可用的标量函数。
| 名称 | 说明 |
|---|---|
age(timestamp, timestamp) | 参数相减,得到两个时间戳之间的时间差。 |
age(timestamp) | 从 current_date 相减。 |
ago(interval) | 从当前时间戳减去一个间隔。 |
century(timestamp) | 提取时间戳所属世纪。 |
current_localtimestamp() | 返回当前时间戳(当前事务开始时)。 |
date_diff(part, starttimestamp, endtimestamp) | starttimestamp 与 endtimestamp 之间 part 边界的数量,包含较大的时间戳,不包含较小的时间戳。 |
date_part([part, ...], timestamp) | 将列出的子字段作为 struct 返回。列表必须是常量。 |
date_part(part, timestamp) | 获取子字段(等价于 extract)。 |
date_sub(part, starttimestamp, endtimestamp) | starttimestamp 与 endtimestamp 之间区间的有符号长度,截断为 part 的整倍数。 |
date_trunc(part, timestamp) | 按指定精度截断。 |
dayname(timestamp) | 星期名称(英文)。 |
epoch_ms(timestamp) | 返回自 epoch 以来的总毫秒数。 |
epoch_ns(timestamp) | Returns the total number of nanoseconds since the epoch. |
epoch_us(timestamp) | 返回自 epoch 以来的总微秒数。 |
epoch(timestamp) | 返回自 epoch 以来的总秒数。 |
extract(field FROM timestamp) | 从时间戳中获取子字段。 |
greatest(timestamp, timestamp) | 两个时间戳中较晚的一个。 |
isfinite(timestamp) | 若时间戳是有限值则返回 true,否则返回 false。 |
isinf(timestamp) | 若时间戳是无穷值则返回 true,否则返回 false。 |
julian(timestamp) | 从时间戳中提取儒略日编号。 |
last_day(timestamp) | 该月的最后一天。 |
least(timestamp, timestamp) | 两个时间戳中较早的一个。 |
make_timestamp(bigint, bigint, bigint, bigint, bigint, double) | 根据给定部分构造时间戳。 |
make_timestamp(microseconds) | 将自 epoch 以来的微秒数转换为时间戳。 |
make_timestamp_ms(milliseconds) | 将自 epoch 以来的毫秒数转换为时间戳。 |
make_timestamp_ns(nanoseconds) | 将自 epoch 以来的纳秒数转换为时间戳。 |
monthname(timestamp) | 月份名称(英文)。 |
strftime(timestamp, format) | 按格式字符串将时间戳转换为字符串。 |
strptime(text, format-list) | 将字符串 text 按列表中的格式字符串依次解析为时间戳,直到成功为止。失败时抛出错误。若要在失败时返回 NULL,请使用 try_strptime。 |
strptime(text, format) | 按格式字符串将字符串 text 解析为时间戳。失败时抛出错误。若要在失败时返回 NULL,请使用 try_strptime。 |
time_bucket(bucket_width, timestamp[, offset]) | 将 timestamp 截断到宽度为 bucket_width 的网格。若 bucket_width 为月或更粗粒度单位,网格锚点为 2000-01-01 00:00:00[ + offset];否则为 2000-01-03 00:00:00[ + offset]。注意 2000-01-03 是星期一。 |
time_bucket(bucket_width, timestamp[, origin]) | 将 timestamp 截断到宽度为 bucket_width 的网格。网格锚定于 origin 时间戳;当 bucket_width 为月或更粗粒度单位时,默认值为 2000-01-01 00:00:00,否则为 2000-01-03 00:00:00。注意 2000-01-03 是星期一。 |
try_strptime(text, format-list) | 将字符串 text 按列表中的格式字符串依次解析为时间戳,直到成功为止。失败时返回 NULL。 |
try_strptime(text, format) | 按格式字符串将字符串 text 解析为时间戳。失败时返回 NULL。 |
此外还提供了专门用于提取子字段的函数。
应用于无穷日期的函数要么返回相同的无穷日期
(例如 greatest),要么返回 NULL(例如 date_part),具体取决于语义是否合理。
通常,如果函数需要检查无穷日期的组成部分,结果将为 NULL。
age(timestamp, timestamp)
| 说明 | 参数相减,得到两个时间戳之间的时间差。 |
| 示例 | age(TIMESTAMP '2001-04-10', TIMESTAMP '1992-09-20') |
| 结果 | 8 years 6 months 20 days |
age(timestamp)
| 说明 | 从 current_date 相减。 |
| 示例 | age(TIMESTAMP '1992-09-20') |
| 结果 | 29 years 1 month 27 days 12:39:00.844 |
ago(interval)
| 说明 | 从当前时间戳减去一个时间间隔,返回过去的时间戳。等价于 current_timestamp - interval。 |
| 示例 | ago(INTERVAL 1 HOUR) |
| 结果 | 2024-11-30 12:28:48.895 (if current time is 2024-11-30 13:28:48.895) |
century(timestamp)
| 说明 | 提取时间戳所属世纪。 |
| 示例 | century(TIMESTAMP '1992-03-22') |
| 结果 | 20 |
current_localtimestamp()
| 说明 | 返回当前带时区时间戳(当前事务开始时)。 |
| 示例 | current_localtimestamp() |
| 结果 | 2024-11-30 13:28:48.895 |
date_diff(part, starttimestamp, endtimestamp)
| 说明 | starttimestamp 与 endtimestamp 之间 part 边界的有符号数量,包含较大的时间戳,不包含较小的时间戳。 |
| 示例 | date_diff('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 结果 | 2 |
date_part([part, ...], timestamp)
| 说明 | 将列出的子字段作为 struct 返回。列表必须是常量。 |
| 示例 | date_part(['year', 'month', 'day'], TIMESTAMP '1992-09-20 20:38:40') |
| 结果 | {year: 1992, month: 9, day: 20} |
date_part(part, timestamp)
| 说明 | 获取子字段(等价于 extract)。 |
| 示例 | date_part('minute', TIMESTAMP '1992-09-20 20:38:40') |
| 结果 | 38 |
date_sub(part, starttimestamp, endtimestamp)
| 说明 | starttimestamp 与 endtimestamp 之间区间的有符号长度,截断为 part 的整倍数。 |
| 示例 | date_sub('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 结果 | 1 |
date_trunc(part, timestamp)
| 说明 | 按指定精度截断。 |
| 示例 | date_trunc('hour', TIMESTAMP '1992-09-20 20:38:40') |
| 结果 | 1992-09-20 20:00:00 |
dayname(timestamp)
| 说明 | 星期名称(英文)。 |
| 示例 | dayname(TIMESTAMP '1992-03-22') |
| 结果 | Sunday |
epoch_ms(timestamp)
| 说明 | 返回自 epoch 以来的总毫秒数。 |
| 示例 | epoch_ms(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 | 1627991984123 |
epoch_ns(timestamp)
| 说明 | 返回自 epoch 以来的总纳秒数。 |
| 示例 | epoch_ns(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 | 1627991984123456000 |
epoch_us(timestamp)
| 说明 | 返回自 epoch 以来的总微秒数。 |
| 示例 | epoch_us(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 | 1627991984123456 |
epoch(timestamp)
| 说明 | 返回自 epoch 以来的总秒数。 |
| 示例 | epoch('2022-11-07 08:43:04'::TIMESTAMP); |
| 结果 | 1667810584 |
extract(field FROM timestamp)
| 说明 | 从时间戳中获取子字段。 |
| 示例 | extract('hour' FROM TIMESTAMP '1992-09-20 20:38:48') |
| 结果 | 20 |
greatest(timestamp, timestamp)
| 说明 | 两个时间戳中较晚的一个。 |
| 示例 | greatest(TIMESTAMP '1992-09-20 20:38:48', TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 | 1992-09-20 20:38:48 |
isfinite(timestamp)
| 说明 | 若时间戳是有限值则返回 true,否则返回 false。 |
| 示例 | isfinite(TIMESTAMP '1992-03-07') |
| 结果 | true |
isinf(timestamp)
| 说明 | 若时间戳是无穷值则返回 true,否则返回 false。 |
| 示例 | isinf(TIMESTAMP '-infinity') |
| 结果 | true |
julian(timestamp)
| 说明 | 从时间戳中提取儒略日编号。 |
| 示例 | julian(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 | 2448704.043091706 |
last_day(timestamp)
| 说明 | 该月的最后一天。 |
| 示例 | last_day(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 | 1992-03-31 |
least(timestamp, timestamp)
| 说明 | 两个时间戳中较早的一个。 |
| 示例 | least(TIMESTAMP '1992-09-20 20:38:48', TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 | 1992-03-22 01:02:03.1234 |
make_timestamp(bigint, bigint, bigint, bigint, bigint, double)
| 说明 | 根据给定部分构造时间戳。 |
| 示例 | make_timestamp(1992, 9, 20, 13, 34, 27.123456) |
| 结果 | 1992-09-20 13:34:27.123456 |
make_timestamp(microseconds)
| 说明 | 将自 epoch 以来的微秒数转换为时间戳。 |
| 示例 | make_timestamp(1667810584123456) |
| 结果 | 2022-11-07 08:43:04.123456 |
make_timestamp_ms(milliseconds)
| 说明 | 将自 epoch 以来的毫秒数转换为时间戳。 |
| 示例 | make_timestamp_ms(1667810584123) |
| 结果 | 2022-11-07 08:43:04.123 |
make_timestamp_ns(nanoseconds)
| 说明 | 将自 epoch 以来的纳秒数转换为时间戳。 |
| 示例 | make_timestamp_ns(1667810584123456789) |
| 结果 | 2022-11-07 08:43:04.123456789 |
monthname(timestamp)
| 说明 | 月份名称(英文)。 |
| 示例 | monthname(TIMESTAMP '1992-09-20') |
| 结果 | September |
strftime(timestamp, format)
| 说明 | 按格式字符串将时间戳转换为字符串。 |
| 示例 | strftime(timestamp '1992-01-01 20:38:40', '%a, %-d %B %Y - %I:%M:%S %p') |
| 结果 | Wed, 1 January 1992 - 08:38:40 PM |
strptime(text, format-list)
| 说明 | 将字符串 text 按列表中的格式字符串依次解析为时间戳,直到成功为止。失败时抛出错误。若要在失败时返回 NULL,请使用 try_strptime。 |
| 示例 | strptime('4/15/2023 10:56:00', ['%d/%m/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S']) |
| 结果 | 2023-04-15 10:56:00 |
strptime(text, format)
| 说明 | 按格式字符串将字符串 text 解析为时间戳。失败时抛出错误。若要在失败时返回 NULL,请使用 try_strptime。 |
| 示例 | strptime('Wed, 1 January 1992 - 08:38:40 PM', '%a, %-d %B %Y - %I:%M:%S %p') |
| 结果 | 1992-01-01 20:38:40 |
time_bucket(bucket_width, timestamp[, offset])
| 说明 | 将 timestamp 截断到宽度为 bucket_width 的网格。当 bucket_width 为月或更粗粒度单位时,网格包含 2000-01-01 00:00:00[ + offset];否则包含 2000-01-03 00:00:00[ + offset]。注意 2000-01-03 是星期一。 |
| 示例 | time_bucket(INTERVAL '10 minutes', TIMESTAMP '1992-04-20 15:26:00-07', INTERVAL '5 minutes') |
| 结果 | 1992-04-20 15:25:00 |
time_bucket(bucket_width, timestamp[, origin])
| 说明 | 将 timestamp 截断到宽度为 bucket_width 的网格。网格包含 origin 时间戳;当 bucket_width 为月或更粗粒度单位时,默认值为 2000-01-01 00:00:00,否则为 2000-01-03 00:00:00。注意 2000-01-03 是星期一。 |
| 示例 | time_bucket(INTERVAL '2 weeks', TIMESTAMP '1992-04-20 15:26:00', TIMESTAMP '1992-04-01 00:00:00') |
| 结果 | 1992-04-15 00:00:00 |
try_strptime(text, format-list)
| 说明 | 将字符串 text 按列表中的格式字符串依次解析为时间戳,直到成功为止。失败时返回 NULL。 |
| 示例 | try_strptime('4/15/2023 10:56:00', ['%d/%m/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S']) |
| 结果 | 2023-04-15 10:56:00 |
try_strptime(text, format)
| 说明 | 按格式字符串将字符串 text 解析为时间戳。失败时返回 NULL。 |
| 示例 | try_strptime('Wed, 1 January 1992 - 08:38:40 PM', '%a, %-d %B %Y - %I:%M:%S %p') |
| 结果 | 1992-01-01 20:38:40 |
时间戳表函数
下表展示了 TIMESTAMP 类型可用的表函数。
| 名称 | 说明 |
|---|---|
generate_series(timestamp, timestamp, interval) | 按给定步长在闭区间内生成时间戳表。 |
range(timestamp, timestamp, interval) | 按给定步长在左闭右开区间内生成时间戳表。 |
表函数边界不允许使用无穷值。
generate_series(timestamp, timestamp, interval)
| 说明 | 按给定步长在闭区间内生成时间戳表。 |
| 示例 | generate_series(TIMESTAMP '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |
range(timestamp, timestamp, interval)
| 说明 | 按给定步长在左闭右开区间内生成时间戳表。 |
| 示例 | range(TIMESTAMP '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |