⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
时间戳函数

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

时间戳运算符

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

运算符 描述 示例 结果
+ 添加 INTERVAL TIMESTAMP '1992-03-22 01:02:03' + INTERVAL 5 DAY 1992-03-27 01:02:03
- TIMESTAMPs 的减法 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

无限值进行加法或减法运算会生成相同的无限值。

标量时间戳函数

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

名称 描述
age(timestamp, timestamp) 减去参数,结果为两个时间戳之间的时间差。
age(timestamp) 从 current_date 中减去。
century(timestamp) 提取时间戳的世纪。
current_localtimestamp() 返回当前时间戳(在事务开始时)。
date_diff(part, startdate, enddate) 时间戳之间分区边界的数量。
date_part([part, ...], timestamp) 将列出的子字段作为struct获取。列表必须是常量。
date_part(part, timestamp) 获取子字段(等同于extract)。
date_sub(part, startdate, enddate) 时间戳之间完整分区的数量。
date_trunc(part, timestamp) 截断到指定的精度
datediff(part, startdate, enddate) date_diff的别名。时间戳之间分区边界的数量。
datepart([part, ...], timestamp) date_part的别名。将列出的子字段作为struct获取。列表必须是常量。
datepart(part, timestamp) date_part的别名。获取子字段(等同于extract)。
datesub(part, startdate, enddate) date_sub的别名。时间戳之间完整分区的数量。
datetrunc(part, timestamp) date_trunc的别名。截断到指定的精度
dayname(timestamp) 工作日的(英文)名称。
epoch_ms(ms) 将自纪元以来的毫秒数转换为时间戳。
epoch_ms(timestamp) 返回自纪元以来的总毫秒数。
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) 从时间戳中提取儒略日数。
last_day(timestamp) 该月的最后一天。
least(timestamp, timestamp) 两个时间戳中较早的那个。
make_timestamp(bigint, bigint, bigint, bigint, bigint, double) 给定部分的对应时间戳。
make_timestamp(microseconds) 将自纪元以来的微秒数转换为时间戳。
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

century(timestamp)

描述 提取时间戳的世纪。
示例 century(TIMESTAMP '1992-03-22')
结果 20

current_localtimestamp()

描述 返回带时区的当前时间戳(在事务开始时)。
示例 current_localtimestamp()
结果 2024-11-30 13:28:48.895

date_diff(part, startdate, enddate)

描述 时间戳之间分区边界的数量。
示例 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, startdate, enddate)

描述 时间戳之间完整分区的数量。
示例 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

datediff(part, startdate, enddate)

描述 date_diff的别名。时间戳之间分区边界的数量。
示例 datediff('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00')
结果 2

datepart([part, ...], timestamp)

描述 date_part的别名。将列出的子字段作为struct获取。列表必须是常量。
示例 datepart(['year', 'month', 'day'], TIMESTAMP '1992-09-20 20:38:40')
结果 {year: 1992, month: 9, day: 20}

datepart(part, timestamp)

描述 date_part的别名。获取子字段(等同于extract)。
示例 datepart('minute', TIMESTAMP '1992-09-20 20:38:40')
结果 38

datesub(part, startdate, enddate)

描述 date_sub的别名。时间戳之间完整分区的数量。
示例 datesub('hour', TIMESTAMP '1992-09-30 23:59:59', TIMESTAMP '1992-10-01 01:58:00')
结果 1

datetrunc(part, timestamp)

描述 date_trunc的别名。截断到指定的精度
示例 datetrunc('hour', TIMESTAMP '1992-09-20 20:38:40')
结果 1992-09-20 20:00:00

dayname(timestamp)

描述 工作日的(英文)名称。
示例 dayname(TIMESTAMP '1992-03-22')
结果 星期日

epoch_ms(ms)

描述 将自纪元以来的毫秒数转换为时间戳。
示例 epoch_ms(701222400000)
结果 1992-03-22 00:00:00

epoch_ms(timestamp)

描述 返回自纪元以来的总毫秒数。
示例 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(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_ns(nanoseconds)

描述 将自纪元以来的纳秒数转换为时间戳。
示例 make_timestamp_ns(1667810584123456789)
结果 2022-11-07 08:43:04.123456789

monthname(timestamp)

描述 月份的(英文)名称。
示例 monthname(TIMESTAMP '1992-09-20')
结果 九月

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)