本节介绍用于检查和操作 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:00 和 1992-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:00 和 1992-03-16 00:00:00 |
对无穷大值 (infinite values) 进行加法或减法运算会产生相同的无穷大值。
下表显示了 DATE 类型可用的函数。通过类型提升,日期也可以使用时间戳函数 (timestamp functions) 进行操作。
| 名称 |
描述 |
date_add(date, interval) |
将时间间隔添加到日期并返回一个 DATETIME 值。 |
date_diff(part, startdate, enddate) |
startdate 和 enddate 之间 part 边界的数量,包含较大的日期,不包含较小的日期。 |
date_part(part, date) |
获取 子字段(等同于 extract)。 |
date_sub(part, startdate, enddate) |
startdate 和 enddate 之间时间间隔的带符号长度,截断为 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() |
本地时区的当前日期(当前事务的开始时间)。 |
| 描述 |
将时间间隔添加到日期并返回一个 DATETIME 值。 |
| 示例 |
date_add(DATE '1992-09-15', INTERVAL 2 MONTH) |
| 结果 |
1992-11-15 00:00:00 |
| 描述 |
startdate 和 enddate 之间 part 边界的数量,包含较大的日期,不包含较小的日期。 |
| 示例 |
date_diff('month', DATE '1992-09-15', DATE '1992-11-14') |
| 结果 |
2 |
| 别名 |
datediff |
| 描述 |
获取子字段(等同于 extract)。 |
| 示例 |
date_part('year', DATE '1992-09-20') |
| 结果 |
1992 |
| 别名 |
datepart |
| 描述 |
startdate 和 enddate 之间时间间隔的带符号长度,截断为 part 的整数倍。 |
| 示例 |
date_sub('month', DATE '1992-09-15', DATE '1992-11-14') |
| 结果 |
1 |
| 别名 |
datesub |
| 描述 |
截断到指定的精度。 |
| 示例 |
date_trunc('month', DATE '1992-03-07') |
| 结果 |
1992-03-01 |
| 别名 |
datetrunc |
| 描述 |
星期几的(英文)名称。 |
| 示例 |
dayname(DATE '1992-09-20') |
| 结果 |
Sunday |
| 描述 |
从日期中获取子字段 (subfield)。 |
| 示例 |
extract('year' FROM DATE '1992-09-20') |
| 结果 |
1992 |
| 描述 |
两个日期中较晚的一个。 |
| 示例 |
greatest(DATE '1992-09-20', DATE '1992-03-07') |
| 结果 |
1992-09-20 |
| 描述 |
如果日期是有限的则返回 true,否则返回 false。 |
| 示例 |
isfinite(DATE '1992-03-07') |
| 结果 |
true |
| 描述 |
如果日期是无穷大则返回 true,否则返回 false。 |
| 示例 |
isinf(DATE '-infinity') |
| 结果 |
true |
| 描述 |
从日期中提取儒略日 (Julian Day) 数字。 |
| 示例 |
julian(DATE '1992-09-20') |
| 结果 |
2448886.0 |
| 描述 |
日期所在月份的最后一天。 |
| 示例 |
last_day(DATE '1992-09-20') |
| 结果 |
1992-09-30 |
| 描述 |
两个日期中较早的一个。 |
| 示例 |
least(DATE '1992-09-20', DATE '1992-03-07') |
| 结果 |
1992-03-07 |
| 描述 |
给定部分组成的日期。 |
| 示例 |
make_date(1992, 9, 20) |
| 结果 |
1992-09-20 |
| 描述 |
月份的(英文)名称。 |
| 示例 |
monthname(DATE '1992-09-20') |
| 结果 |
September |
| 描述 |
根据格式字符串将日期转换为字符串。 |
| 示例 |
strftime(DATE '1992-01-01', '%a, %-d %B %Y') |
| 结果 |
Wed, 1 January 1992 |
| 描述 |
将 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 |
| 描述 |
将 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() |
| 结果 |
2022-10-08 |
| 别名 |
current_date(不需要括号) |
还有专门的提取函数用于获取子字段。一些示例包括从日期中提取“天”,或从日期中提取“星期几”。
应用于无穷大日期的函数将返回相同的无穷大日期(例如 greatest)或返回 NULL(例如 date_part),具体取决于“逻辑上是否合理”。通常,如果函数需要检查无穷大日期的各个组成部分,结果将为 NULL。
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰