本节描述了用于检查和操作 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 |
对无限值进行加减操作会产生相同的无限值。
下表显示了 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 |
结果 |
2022-10-08 |
描述 |
将间隔添加到日期并返回 DATETIME 值。 |
示例 |
date_add(DATE '1992-09-15', INTERVAL 2 MONTH) |
结果 |
1992-11-15 00:00:00 |
描述 |
日期之间的分区边界数量。 |
示例 |
date_diff('month', DATE '1992-09-15', DATE '1992-11-14') |
结果 |
2 |
描述 |
获取子字段(等同于 extract )。 |
示例 |
date_part('year', DATE '1992-09-20') |
结果 |
1992 |
描述 |
日期之间完整分区的数量。 |
示例 |
date_sub('month', DATE '1992-09-15', DATE '1992-11-14') |
结果 |
1 |
描述 |
截断到指定的精度。 |
示例 |
date_trunc('month', DATE '1992-03-07') |
结果 |
1992-03-01 |
描述 |
日期之间的分区边界数量。 |
示例 |
datediff('month', DATE '1992-09-15', DATE '1992-11-14') |
结果 |
2 |
别名 |
date_diff . |
描述 |
获取子字段(等同于 extract )。 |
示例 |
datepart('year', DATE '1992-09-20') |
结果 |
1992 |
别名 |
date_part . |
描述 |
日期之间完整分区的数量。 |
示例 |
datesub('month', DATE '1992-09-15', DATE '1992-11-14') |
结果 |
1 |
别名 |
date_sub . |
描述 |
截断到指定的精度。 |
示例 |
datetrunc('month', DATE '1992-03-07') |
结果 |
1992-03-01 |
别名 |
date_trunc . |
描述 |
星期几的(英文)名称。 |
示例 |
dayname(DATE '1992-09-20') |
结果 |
Sunday |
描述 |
从日期中提取子字段。 |
示例 |
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(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 |
描述 |
UTC 时间当前日期(当前事务开始时)。 |
示例 |
today() |
结果 |
2022-10-08 |
还有专门的提取函数来获取子字段。一些例子包括从日期中提取天数,或从日期中提取星期几。
应用于无限日期的函数将根据“是否有意义”返回相同的无限日期(例如,greatest
)或 NULL
(例如,date_part
)。通常,如果函数需要检查无限日期的部分,结果将是 NULL
。