日期函数
本节介绍用于检查和操作 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 类型可用的函数。
通过类型提升,也可以使用时间戳函数来处理日期。
| 名称 | 描述 |
|---|---|
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) | 从日期中获取子字段。 |
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() | 本地时区中的当前日期(当前事务开始时)。 |
date_add(date, interval)
| Description | 将区间加到日期上,并返回 DATETIME 值。 |
| Example | date_add(DATE '1992-09-15', INTERVAL 2 MONTH) |
| Result | 1992-11-15 00:00:00 |
date_diff(part, startdate, enddate)
| Description | startdate 和 enddate 之间 part 边界的数量,包含较大的日期,不包含较小的日期。 |
| Example | date_diff('month', DATE '1992-09-15', DATE '1992-11-14') |
| Result | 2 |
| Alias | datediff |
date_part(part, date)
| Description | 获取子字段(等价于 extract)。 |
| Example | date_part('year', DATE '1992-09-20') |
| Result | 1992 |
| Alias | datepart |
date_sub(part, startdate, enddate)
| Description | startdate 与 enddate 之间带符号的区间长度,并截断到 part 的整数倍。 |
| Example | date_sub('month', DATE '1992-09-15', DATE '1992-11-14') |
| Result | 1 |
| Alias | datesub |
date_trunc(part, date)
| Description | 截断到指定精度。 |
| Example | date_trunc('month', DATE '1992-03-07') |
| Result | 1992-03-01 |
| Alias | datetrunc |
dayname(date)
| Description | 星期名称(英文)。 |
| Example | dayname(DATE '1992-09-20') |
| Result | Sunday |
extract(part from date)
| Description | 从日期中获取子字段。 |
| Example | extract('year' FROM DATE '1992-09-20') |
| Result | 1992 |
greatest(date, date)
| Description | 两个日期中较晚的一个。 |
| Example | greatest(DATE '1992-09-20', DATE '1992-03-07') |
| Result | 1992-09-20 |
isfinite(date)
| Description | 如果日期是有限值则返回 true,否则返回 false。 |
| Example | isfinite(DATE '1992-03-07') |
| Result | true |
isinf(date)
| Description | 如果日期是无穷值则返回 true,否则返回 false。 |
| Example | isinf(DATE '-infinity') |
| Result | true |
julian(date)
| Description | 从日期中提取儒略日编号。 |
| Example | julian(DATE '1992-09-20') |
| Result | 2448886.0 |
last_day(date)
| Description | 返回该日期所在月份的最后一天。 |
| Example | last_day(DATE '1992-09-20') |
| Result | 1992-09-30 |
least(date, date)
| Description | 两个日期中较早的一个。 |
| Example | least(DATE '1992-09-20', DATE '1992-03-07') |
| Result | 1992-03-07 |
make_date(year, month, day)
| Description | 根据给定部分构造日期。 |
| Example | make_date(1992, 9, 20) |
| Result | 1992-09-20 |
monthname(date)
| Description | 月份名称(英文)。 |
| Example | monthname(DATE '1992-09-20') |
| Result | September |
strftime(date, format)
| Description | 按格式字符串将日期转换为字符串。 |
| Example | strftime(DATE '1992-01-01', '%a, %-d %B %Y') |
| Result | Wed, 1 January 1992 |
time_bucket(bucket_width, date[, offset])
| Description | 将 date 截断到宽度为 bucket_width 的网格。若 bucket_width 以月或更粗粒度计,则网格锚点为 2000-01-01[ + offset],否则为 2000-01-03[ + offset]。注意 2000-01-03 是星期一。 |
| Example | time_bucket(INTERVAL '2 months', DATE '1992-04-20', INTERVAL '1 month') |
| Result | 1992-04-01 |
time_bucket(bucket_width, date[, origin])
| Description | 将 timestamptz 截断到宽度为 bucket_width 的网格。网格锚点为 origin 时间戳;若 bucket_width 以月或更粗粒度计,默认锚点为 2000-01-01,否则为 2000-01-03。注意 2000-01-03 是星期一。 |
| Example | time_bucket(INTERVAL '2 weeks', DATE '1992-04-20', DATE '1992-04-01') |
| Result | 1992-04-15 |
today()
| Description | 本地时区中的当前日期(当前事务开始时)。 |
| Example | today() |
| Result | 2022-10-08 |
| Alias | current_date(无需括号) |
日期部分提取函数
还提供了专用提取函数来获取子字段。 例如,可以从日期中提取“日”或“星期几”。
对无穷日期应用函数时,将根据语义返回相同的无穷日期(例如 greatest)或 NULL(例如 date_part)。
通常来说,如果函数需要检查无穷日期的组成部分,结果将是 NULL。