⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
日期函数

本节描述了用于检查和操作 DATE 值的函数和运算符。

日期运算符

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

运算符 描述 示例 结果
+ 天数(整数)相加 DATE '1992-03-22' + 5 1992-03-27
+ 添加 INTERVAL DATE '1992-03-22' + INTERVAL 5 DAY 1992-03-27 00:00:00
+ 可变 INTERVAL 相加 SELECT DATE '1992-03-22' + INTERVAL (d.days) DAY FROM (VALUES (5), (11)) d(days) 1992-03-27 00:00:001992-04-02 00:00:00
- DATE 相减 DATE '1992-03-27' - DATE '1992-03-22' 5
- 减去 INTERVAL DATE '1992-03-27' - INTERVAL 5 DAY 1992-03-22 00:00:00
- 可变 INTERVAL 相减 SELECT DATE '1992-03-27' - INTERVAL (d.days) DAY FROM (VALUES (5), (11)) d(days) 1992-03-22 00:00:001992-03-16 00:00:00

无限值进行加减操作会产生相同的无限值。

日期函数

下表显示了 DATE 类型可用的函数。日期也可以通过类型提升使用时间戳函数进行操作。

名称 描述
current_date 本地时区中当前日期(当前事务开始时)。请注意,函数调用中应省略括号。
date_add(date, interval) 将间隔添加到日期并返回 DATETIME 值。
date_diff(part, startdate, enddate) 日期之间的分区边界数量。
date_part(part, date) 获取子字段(等同于 extract)。
date_sub(part, startdate, enddate) 日期之间完整分区的数量。
date_trunc(part, date) 截断到指定的精度
datediff(part, startdate, enddate) 日期之间的分区边界数量。date_diff 的别名。
datepart(part, date) 获取子字段(等同于 extract)。date_part 的别名。
datesub(part, startdate, enddate) 日期之间完整分区的数量。date_sub 的别名。
datetrunc(part, date) 截断到指定的精度date_trunc 的别名。
dayname(date) 星期几的(英文)名称。
extract(part from date) 从日期中提取子字段
greatest(date, date) 两个日期中较晚的一个。
isfinite(date) 如果日期是有限的,则返回 true,否则返回 false。
isinf(date) 如果日期是无限的,则返回 true,否则返回 false。
julian(date) 从日期中提取儒略日数。
last_day(date) 日期中对应月份的最后一天。
least(date, date) 两个日期中较早的一个。
make_date(year, month, day) 给定部分的日期。
monthname(date) 月份的(英文)名称。
strftime(date, format) 根据格式字符串将日期转换为字符串。
time_bucket(bucket_width, date[, offset]) date截断为宽度为bucket_width的网格。当bucket_width是月份或更粗粒度的单位时,网格锚定在2000-01-01[ + offset],否则锚定在2000-01-03[ + offset]。请注意,2000-01-03是星期一。
time_bucket(bucket_width, date[, origin]) timestamptz截断为宽度为bucket_width的网格。网格锚定在origin时间戳,当bucket_width是月份或更粗粒度的单位时,默认锚定在2000-01-01,否则锚定在2000-01-03。请注意,2000-01-03是星期一。
today() UTC 时间当前日期(当前事务开始时)。

current_date

描述 本地时区中当前日期(当前事务开始时)。请注意,函数调用中应省略括号。
示例 current_date
结果 2022-10-08

date_add(date, interval)

描述 将间隔添加到日期并返回 DATETIME 值。
示例 date_add(DATE '1992-09-15', INTERVAL 2 MONTH)
结果 1992-11-15 00:00:00

date_diff(part, startdate, enddate)

描述 日期之间的分区边界数量。
示例 date_diff('month', DATE '1992-09-15', DATE '1992-11-14')
结果 2

date_part(part, date)

描述 获取子字段(等同于 extract)。
示例 date_part('year', DATE '1992-09-20')
结果 1992

date_sub(part, startdate, enddate)

描述 日期之间完整分区的数量。
示例 date_sub('month', DATE '1992-09-15', DATE '1992-11-14')
结果 1

date_trunc(part, date)

描述 截断到指定的精度
示例 date_trunc('month', DATE '1992-03-07')
结果 1992-03-01

datediff(part, startdate, enddate)

描述 日期之间的分区边界数量。
示例 datediff('month', DATE '1992-09-15', DATE '1992-11-14')
结果 2
别名 date_diff.

datepart(part, date)

描述 获取子字段(等同于 extract)。
示例 datepart('year', DATE '1992-09-20')
结果 1992
别名 date_part.

datesub(part, startdate, enddate)

描述 日期之间完整分区的数量。
示例 datesub('month', DATE '1992-09-15', DATE '1992-11-14')
结果 1
别名 date_sub.

datetrunc(part, date)

描述 截断到指定的精度
示例 datetrunc('month', DATE '1992-03-07')
结果 1992-03-01
别名 date_trunc.

dayname(date)

描述 星期几的(英文)名称。
示例 dayname(DATE '1992-09-20')
结果 Sunday

extract(part from date)

描述 从日期中提取子字段
示例 extract('year' FROM DATE '1992-09-20')
结果 1992

greatest(date, date)

描述 两个日期中较晚的一个。
示例 greatest(DATE '1992-09-20', DATE '1992-03-07')
结果 1992-09-20

isfinite(date)

描述 如果日期是有限的,则返回 true,否则返回 false。
示例 isfinite(DATE '1992-03-07')
结果 true

isinf(date)

描述 如果日期是无限的,则返回 true,否则返回 false。
示例 isinf(DATE '-infinity')
结果 true

julian(date)

描述 从日期中提取儒略日数。
示例 julian(DATE '1992-09-20')
结果 2448886.0

last_day(date)

描述 日期中对应月份的最后一天。
示例 last_day(DATE '1992-09-20')
结果 1992-09-30

least(date, date)

描述 两个日期中较早的一个。
示例 least(DATE '1992-09-20', DATE '1992-03-07')
结果 1992-03-07

make_date(year, month, day)

描述 给定部分的日期。
示例 make_date(1992, 9, 20)
结果 1992-09-20

monthname(date)

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

strftime(date, format)

描述 根据格式字符串将日期转换为字符串。
示例 strftime(DATE '1992-01-01', '%a, %-d %B %Y')
结果 Wed, 1 January 1992

time_bucket(bucket_width, date[, offset])

描述 date截断为宽度为bucket_width的网格。当bucket_width是月份或更粗粒度的单位时,网格锚定在2000-01-01[ + offset],否则锚定在2000-01-03[ + offset]。请注意,2000-01-03是星期一。
示例 time_bucket(INTERVAL '2 months', DATE '1992-04-20', INTERVAL '1 month')
结果 1992-04-01

time_bucket(bucket_width, date[, origin])

描述 timestamptz截断为宽度为bucket_width的网格。网格锚定在origin时间戳,当bucket_width是月份或更粗粒度的单位时,默认锚定在2000-01-01,否则锚定在2000-01-03。请注意,2000-01-03是星期一。
示例 time_bucket(INTERVAL '2 weeks', DATE '1992-04-20', DATE '1992-04-01')
结果 1992-04-15

today()

描述 UTC 时间当前日期(当前事务开始时)。
示例 today()
结果 2022-10-08

日期部分提取函数

还有专门的提取函数来获取子字段。一些例子包括从日期中提取天数,或从日期中提取星期几。

应用于无限日期的函数将根据“是否有意义”返回相同的无限日期(例如,greatest)或 NULL(例如,date_part)。通常,如果函数需要检查无限日期的部分,结果将是 NULL