⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 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

无穷大值 (infinite values) 进行加法或减法运算会产生相同的无穷大值。

日期函数

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

名称 描述
date_add(date, interval) 将时间间隔添加到日期并返回一个 DATETIME 值。
date_diff(part, startdate, enddate) startdateenddate 之间 part 边界的数量,包含较大的日期,不包含较小的日期。
date_part(part, date) 获取 子字段(等同于 extract)。
date_sub(part, startdate, enddate) startdateenddate 之间时间间隔的带符号长度,截断为 part 的整数倍。
date_trunc(part, date) 截断到指定的精度
dayname(date) 星期几的(英文)名称。
extract(part from date) 从日期中获取子字段 (subfield)
greatest(date, date) 两个日期中较晚的一个。
isfinite(date) 如果日期是有限的则返回 true,否则返回 false。
isinf(date) 如果日期是无穷大则返回 true,否则返回 false。
julian(date) 从日期中提取儒略日 (Julian Day) 数字。
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() 本地时区的当前日期(当前事务的开始时间)。

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)

描述 startdateenddate 之间 part 边界的数量,包含较大的日期,不包含较小的日期。
示例 date_diff('month', DATE '1992-09-15', DATE '1992-11-14')
结果 2
别名 datediff

date_part(part, date)

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

date_sub(part, startdate, enddate)

描述 startdateenddate 之间时间间隔的带符号长度,截断为 part 的整数倍。
示例 date_sub('month', DATE '1992-09-15', DATE '1992-11-14')
结果 1
别名 datesub

date_trunc(part, date)

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

dayname(date)

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

extract(part from date)

描述 从日期中获取子字段 (subfield)
示例 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 Day) 数字。
示例 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()

描述 本地时区的当前日期(当前事务的开始时间)。
示例 today()
结果 2022-10-08
别名 current_date(不需要括号)

日期部分提取函数

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

应用于无穷大日期的函数将返回相同的无穷大日期(例如 greatest)或返回 NULL(例如 date_part),具体取决于“逻辑上是否合理”。通常,如果函数需要检查无穷大日期的各个组成部分,结果将为 NULL

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南