跳到主要内容

日期函数

本节介绍用于检查和操作 DATE 值的函数和运算符。

日期运算符

下表列出了 DATE 类型可用的数学运算符。

运算符描述示例结果
+加上天数(整数)DATE '1992-03-22' + 51992-03-27
+加上一个 INTERVALDATE '1992-03-22' + INTERVAL 5 DAY1992-03-27 00:00:00
+加上变量 INTERVALSELECT 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
-减去一个 INTERVALDATE '1992-03-27' - INTERVAL 5 DAY1992-03-22 00:00:00
-减去变量 INTERVALSELECT 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 类型可用的函数。 通过类型提升,也可以使用时间戳函数来处理日期。

名称描述
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)从日期中获取子字段
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 | startdateenddate 之间 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 | startdateenddate 之间带符号的区间长度,并截断到 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