跳到主要内容

时间戳函数

本节介绍用于检查和操作 TIMESTAMP的函数和运算符。 另请参阅相关的 TIMESTAMPTZ 函数

时间戳运算符

下表展示了 TIMESTAMP 类型可用的数学运算符。

运算符说明示例结果
+INTERVAL 相加TIMESTAMP '1992-03-22 01:02:03' + INTERVAL 5 DAY1992-03-27 01:02:03
-TIMESTAMP 相减TIMESTAMP '1992-03-27' - TIMESTAMP '1992-03-22'5 days
-减去 INTERVALTIMESTAMP '1992-03-27 01:02:03' - INTERVAL 5 DAY1992-03-22 01:02:03

无穷值进行加减运算会得到相同的无穷值。

标量时间戳函数

下表展示了 TIMESTAMP 值可用的标量函数。

名称说明
age(timestamp, timestamp)参数相减,得到两个时间戳之间的时间差。
age(timestamp)从 current_date 相减。
ago(interval)从当前时间戳减去一个间隔。
century(timestamp)提取时间戳所属世纪。
current_localtimestamp()返回当前时间戳(当前事务开始时)。
date_diff(part, starttimestamp, endtimestamp)starttimestampendtimestamp 之间 part 边界的数量,包含较大的时间戳,不包含较小的时间戳。
date_part([part, ...], timestamp)将列出的子字段作为 struct 返回。列表必须是常量。
date_part(part, timestamp)获取子字段(等价于 extract)。
date_sub(part, starttimestamp, endtimestamp)starttimestampendtimestamp 之间区间的有符号长度,截断为 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)

| 说明 | starttimestampendtimestamp 之间 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)

| 说明 | starttimestampendtimestamp 之间区间的有符号长度,截断为 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) |