⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Timestamp Functions

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

时间戳操作符

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

Operator Description Example Result
+ 添加一个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 days
- 减去一个INTERVAL TIMESTAMP '1992-03-27 01:02:03' - INTERVAL 5 DAY 1992-03-22 01:02:03

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

标量时间戳函数

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

Name Description
age(timestamp, timestamp) 减去参数,得到两个时间戳之间的时间差。
age(timestamp) 从当前日期减去。
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_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。
last_day(timestamp) 该月的最后一天。
least(timestamp, timestamp) 两个时间戳中较早的一个。
make_timestamp(bigint, bigint, bigint, bigint, bigint, double) 给定部分的时间戳。
make_timestamp(microseconds) 自纪元以来的给定微秒数的时间戳。
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。桶通过 offset 间隔进行偏移。
time_bucket(bucket_width, timestamp[, origin]) timestamp 截断为指定的间隔 bucket_width。桶相对于 origin 时间戳对齐。origin 默认为 2000-01-03 00:00:00,用于不包含月或年间隔的桶,而对于月和年桶,则默认为 2000-01-01 00:00:00。
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)

描述 从当前日期减去。
示例 age(TIMESTAMP '1992-09-20')
结果 29 years 1 month 27 days 12:39:00.844

century(timestamp)

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

current_localtimestamp()

描述 返回带有时区的当前时间戳(在事务开始时)。
示例 current_localimestamp()
结果 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')
Result 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)

Description Get subfield (equivalent to 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')
Result 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')
Result 2

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

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

datepart(part, timestamp)

Description Alias of date_part. Get subfield (equivalent to extract).
示例 datepart('minute', TIMESTAMP '1992-09-20 20:38:40')
Result 38

datesub(part, startdate, enddate)

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

datetrunc(part, timestamp)

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

dayname(timestamp)

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

epoch_ms(ms)

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

epoch_ms(timestamp)

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

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')
Result 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')
Result true

isinf(timestamp)

描述 如果时间戳是无限的,则返回 true,否则返回 false。
示例 isinf(TIMESTAMP '-infinity')
Result true

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

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])

描述 通过指定的间隔 bucket_width 截断 timestamp。桶通过 offset 间隔偏移。
示例 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时间戳对齐。origin默认值为2000-01-03 00:00:00,用于不包含月或年间隔的桶,而对于月和年桶,默认值为2000-01-01 00:00:00。
示例 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'])
Result 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')
Result 1992-01-01 20:38:40

时间戳表函数

下表显示了可用于TIMESTAMP类型的表函数。

Name Description
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)