PostgreSQL 的 EXTRACT(QUARTER FROM <interval>) 是基于 1 的吗?
Is PostgreSQL's EXTRACT(QUARTER FROM <interval>) 1-based?
考虑以下查询:
SELECT
INTERVAL '1 month' * v AS i,
EXTRACT(YEAR FROM INTERVAL '1 month' * v) AS y,
EXTRACT(QUARTER FROM INTERVAL '1 month' * v) AS q,
EXTRACT(MONTH FROM INTERVAL '1 month' * v) AS m
FROM generate_series(0, 16) t(v)
令我惊讶的是:
i |y|q|m |
-------------|-|-|--|
00:00:00|0|1| 0|
1 mon|0|1| 1|
2 mons|0|1| 2|
3 mons|0|2| 3|
4 mons|0|2| 4|
5 mons|0|2| 5|
6 mons|0|3| 6|
7 mons|0|3| 7|
8 mons|0|3| 8|
9 mons|0|4| 9|
10 mons|0|4|10|
11 mons|0|4|11|
1 year|1|1| 0|
1 year 1 mon|1|1| 1|
1 year 2 mons|1|1| 2|
1 year 3 mons|1|2| 3|
1 year 4 mons|1|2| 4|
因此,当从 "normalized" INTERVAL
(由 INTERVAL '1 month' * <some integer>
表达式生成)中提取 QUARTER
时,我们得到值 1-4
(如如果此提取以某种方式基于 1),而从 INTERVAL
中提取 YEAR
或 MONTH
会生成值 0-N
(YEAR
)或 0-11
(MONTH
), 分别.
此行为背后的基本原理是什么?是否有记录? (I do not think it is documented here, explicitly)
是的。
您似乎特意避免简单阅读文档。第 9.1.1 节开始:
9.9.1. EXTRACT, date_part
EXTRACT(field FROM source)
The extract function retrieves subfields such as year or hour from date/time values. source must be a value expression of type timestamp, time, or interval. ... The following are valid field names
(我的重点)
然后继续描述每个字段和可能的值。如果没有任何相反的指示,那么,这是从间隔中提取字段时发生的情况的文档。
而且,我们确实看到了 day
:
For timestamp
values, the day (of the month) field (1 - 31) ; for interval
values, the number of days
因此,我们可以看到,在他们希望突出显示间隔和时间戳之间的差异的地方,他们可以在单独的字段描述中做到这一点。同样,对于 month
,他们分别记录时间戳和间隔处理,因此他们似乎有一种 一致 记录差异的方式。
所以,最后,我们到达 quarter
:
The quarter of the year (1 - 4) that the date is in
就是这样。那是文档,它同样适用于时间戳和间隔。
考虑以下查询:
SELECT
INTERVAL '1 month' * v AS i,
EXTRACT(YEAR FROM INTERVAL '1 month' * v) AS y,
EXTRACT(QUARTER FROM INTERVAL '1 month' * v) AS q,
EXTRACT(MONTH FROM INTERVAL '1 month' * v) AS m
FROM generate_series(0, 16) t(v)
令我惊讶的是:
i |y|q|m |
-------------|-|-|--|
00:00:00|0|1| 0|
1 mon|0|1| 1|
2 mons|0|1| 2|
3 mons|0|2| 3|
4 mons|0|2| 4|
5 mons|0|2| 5|
6 mons|0|3| 6|
7 mons|0|3| 7|
8 mons|0|3| 8|
9 mons|0|4| 9|
10 mons|0|4|10|
11 mons|0|4|11|
1 year|1|1| 0|
1 year 1 mon|1|1| 1|
1 year 2 mons|1|1| 2|
1 year 3 mons|1|2| 3|
1 year 4 mons|1|2| 4|
因此,当从 "normalized" INTERVAL
(由 INTERVAL '1 month' * <some integer>
表达式生成)中提取 QUARTER
时,我们得到值 1-4
(如如果此提取以某种方式基于 1),而从 INTERVAL
中提取 YEAR
或 MONTH
会生成值 0-N
(YEAR
)或 0-11
(MONTH
), 分别.
此行为背后的基本原理是什么?是否有记录? (I do not think it is documented here, explicitly)
是的。
您似乎特意避免简单阅读文档。第 9.1.1 节开始:
9.9.1. EXTRACT, date_part
EXTRACT(field FROM source)
The extract function retrieves subfields such as year or hour from date/time values. source must be a value expression of type timestamp, time, or interval. ... The following are valid field names
(我的重点)
然后继续描述每个字段和可能的值。如果没有任何相反的指示,那么,这是从间隔中提取字段时发生的情况的文档。
而且,我们确实看到了 day
:
For
timestamp
values, the day (of the month) field (1 - 31) ; forinterval
values, the number of days
因此,我们可以看到,在他们希望突出显示间隔和时间戳之间的差异的地方,他们可以在单独的字段描述中做到这一点。同样,对于 month
,他们分别记录时间戳和间隔处理,因此他们似乎有一种 一致 记录差异的方式。
所以,最后,我们到达 quarter
:
The quarter of the year (1 - 4) that the date is in
就是这样。那是文档,它同样适用于时间戳和间隔。