本节介绍用于检查和操作 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 天 |
- |
减去 INTERVAL |
TIMESTAMP '1992-03-27 01:02:03' - INTERVAL 5 DAY |
1992-03-22 01:02:03 |
对 无限值(infinite values) 进行加减运算将产生同样的无限值。
下表显示了 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) |
返回自纪元以来的总纳秒数。 |
epoch_us(timestamp) |
返回自纪元以来的总微秒数。 |
epoch(timestamp) |
返回自纪元以来的总秒数。 |
extract(field FROM timestamp) |
从时间戳中获取 子字段。 |
greatest(timestamp, timestamp) |
两个时间戳中较晚的一个。 |
isfinite(timestamp) |
如果时间戳是有限的则返回 true,否则返回 false。 |
isinf(timestamp) |
如果时间戳是无限的则返回 true,否则返回 false。 |
julian(timestamp) |
从时间戳中提取儒略日(Julian Day)编号。 |
last_day(timestamp) |
该月的最后一天。 |
least(timestamp, timestamp) |
两个时间戳中较早的一个。 |
make_timestamp(bigint, bigint, bigint, bigint, bigint, double) |
由给定部分组成的时间戳。 |
make_timestamp(microseconds) |
将自纪元以来的微秒数转换为时间戳。 |
make_timestamp_ms(milliseconds) |
将自纪元以来的毫秒数转换为时间戳。 |
make_timestamp_ns(nanoseconds) |
将自纪元以来的纳秒数转换为时间戳。 |
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 '2001-04-10', TIMESTAMP '1992-09-20') |
| 结果 |
8 年 6 个月 20 天 |
| 描述 |
从 current_date 中减去。 |
| 示例 |
age(TIMESTAMP '1992-09-20') |
| 结果 |
29 年 1 个月 27 天 12:39:00.844 |
| 描述 |
从当前时间戳中减去一个时间间隔,返回过去的一个时间戳。等同于 current_timestamp - interval。 |
| 示例 |
ago(INTERVAL 1 HOUR) |
| 结果 |
2024-11-30 12:28:48.895 (如果当前时间是 2024-11-30 13:28:48.895) |
| 描述 |
提取时间戳的世纪。 |
| 示例 |
century(TIMESTAMP '1992-03-22') |
| 结果 |
20 |
| 描述 |
返回当前带有时区的时间戳(在事务开始时)。 |
| 示例 |
current_localtimestamp() |
| 结果 |
2024-11-30 13:28:48.895 |
| 描述 |
starttimestamp 和 endtimestamp 之间 part 边界的有符号数量,包含较大的时间戳,不包含较小的时间戳。 |
| 示例 |
date_diff('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 结果 |
2 |
| 描述 |
以 struct(结构体)形式获取列出的 子字段。该列表必须为常量。 |
| 示例 |
date_part(['year', 'month', 'day'], TIMESTAMP '1992-09-20 20:38:40') |
| 结果 |
{year: 1992, month: 9, day: 20} |
| 描述 |
获取 子字段(等同于 extract)。 |
| 示例 |
date_part('minute', TIMESTAMP '1992-09-20 20:38:40') |
| 结果 |
38 |
| 描述 |
starttimestamp 和 endtimestamp 之间的时间间隔的有符号长度,截断为 part 的整数倍。 |
| 示例 |
date_sub('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00') |
| 结果 |
1 |
| 描述 |
截断到指定的精度。 |
| 示例 |
date_trunc('hour', TIMESTAMP '1992-09-20 20:38:40') |
| 结果 |
1992-09-20 20:00:00 |
| 描述 |
星期几的(英文)名称。 |
| 示例 |
dayname(TIMESTAMP '1992-03-22') |
| 结果 |
Sunday |
| 描述 |
返回自纪元(epoch)以来的总毫秒数。 |
| 示例 |
epoch_ms(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 |
1627991984123 |
| 描述 |
返回自纪元以来的总纳秒数。 |
| 示例 |
epoch_ns(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 |
1627991984123456000 |
| 描述 |
返回自纪元以来的总微秒数。 |
| 示例 |
epoch_us(TIMESTAMP '2021-08-03 11:59:44.123456') |
| 结果 |
1627991984123456 |
| 描述 |
返回自纪元以来的总秒数。 |
| 示例 |
epoch('2022-11-07 08:43:04'::TIMESTAMP); |
| 结果 |
1667810584 |
| 描述 |
从时间戳中获取 子字段。 |
| 示例 |
extract('hour' FROM TIMESTAMP '1992-09-20 20:38:48') |
| 结果 |
20 |
| 描述 |
两个时间戳中较晚的一个。 |
| 示例 |
greatest(TIMESTAMP '1992-09-20 20:38:48', TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 |
1992-09-20 20:38:48 |
| 描述 |
如果时间戳是有限的则返回 true,否则返回 false。 |
| 示例 |
isfinite(TIMESTAMP '1992-03-07') |
| 结果 |
true |
| 描述 |
如果时间戳是无限的则返回 true,否则返回 false。 |
| 示例 |
isinf(TIMESTAMP '-infinity') |
| 结果 |
true |
| 描述 |
从时间戳中提取儒略日(Julian Day)编号。 |
| 示例 |
julian(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 |
2448704.043091706 |
| 描述 |
该月的最后一天。 |
| 示例 |
last_day(TIMESTAMP '1992-03-22 01:02:03.1234') |
| 结果 |
1992-03-31 |
| 描述 |
两个时间戳中较早的一个。 |
| 示例 |
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(1992, 9, 20, 13, 34, 27.123456) |
| 结果 |
1992-09-20 13:34:27.123456 |
| 描述 |
将自纪元以来的微秒数转换为时间戳。 |
| 示例 |
make_timestamp(1667810584123456) |
| 结果 |
2022-11-07 08:43:04.123456 |
| 描述 |
将自纪元以来的毫秒数转换为时间戳。 |
| 示例 |
make_timestamp(1667810584123) |
| 结果 |
2022-11-07 08:43:04.123 |
| 描述 |
将自纪元以来的纳秒数转换为时间戳。 |
| 示例 |
make_timestamp_ns(1667810584123456789) |
| 结果 |
2022-11-07 08:43:04.123456789 |
| 描述 |
月份的(英文)名称。 |
| 示例 |
monthname(TIMESTAMP '1992-09-20') |
| 结果 |
September |
| 描述 |
根据 格式字符串 将时间戳转换为字符串。 |
| 示例 |
strftime(timestamp '1992-01-01 20:38:40', '%a, %-d %B %Y - %I:%M:%S %p') |
| 结果 |
Wed, 1 January 1992 - 08:38:40 PM |
| 描述 |
应用列表中的 格式字符串 将字符串 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 |
| 描述 |
根据 格式字符串 将字符串 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 |
| 描述 |
将 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 |
| 描述 |
将 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 |
| 描述 |
应用列表中的 格式字符串 将字符串 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 |
| 描述 |
根据 格式字符串 将字符串 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 '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |
| 描述 |
生成一个半开区间内的时间戳表,按间隔步进。 |
| 示例 |
range(TIMESTAMP '2001-04-10', TIMESTAMP '2001-04-11', INTERVAL 30 MINUTE) |
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰