⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
时间戳函数

本节介绍用于检查和操作 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) 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) 返回自纪元以来的总纳秒数。
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, timestamp)

描述 将参数相减,得出两个时间戳之间的时间差。
示例 age(TIMESTAMP '2001-04-10', TIMESTAMP '1992-09-20')
结果 8 年 6 个月 20 天

age(timestamp)

描述 从 current_date 中减去。
示例 age(TIMESTAMP '1992-09-20')
结果 29 年 1 个月 27 天 12:39:00.844

ago(interval)

描述 从当前时间戳中减去一个时间间隔,返回过去的一个时间戳。等同于 current_timestamp - interval
示例 ago(INTERVAL 1 HOUR)
结果 2024-11-30 12:28:48.895 (如果当前时间是 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_ns(TIMESTAMP '2021-08-03 11:59:44.123456')
结果 1627991984123456000

epoch_us(timestamp)

描述 返回自纪元以来的总微秒数。
示例 epoch_us(TIMESTAMP '2021-08-03 11:59:44.123456')
结果 1627991984123456

epoch(timestamp)

描述 返回自纪元以来的总秒数。
示例 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 Day)编号。
示例 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)

描述 将自纪元以来的微秒数转换为时间戳。
示例 make_timestamp(1667810584123456)
结果 2022-11-07 08:43:04.123456

make_timestamp_ms(milliseconds)

描述 将自纪元以来的毫秒数转换为时间戳。
示例 make_timestamp(1667810584123)
结果 2022-11-07 08:43:04.123

make_timestamp_ns(nanoseconds)

描述 将自纪元以来的纳秒数转换为时间戳。
示例 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)
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南