PostgreSQL的EXTRACT(QUARTER FROM )基于1?

问题描述 投票:2回答:1

请考虑以下查询:

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|

因此,当从这样的“规范化” QUARTER(由INTERVAL表达式产生)中提取INTERVAL '1 month' * <some integer>时,我们得到的值1-4(好像此提取基于1) YEAR中的MONTHINTERVAL分别产生值0-NYEAR)或0-11MONTH)。

此行为背后的原理是什么,是否已记录在案? (It's not documented here

sql postgresql intervals
1个回答
0
投票

您似乎会竭尽全力避免对文档进行简单阅读。第9.1.1节开始:

9.9.1。摘录,date_part

EXTRACT(field FROM source)

提取功能从日期/时间值中检索子字段,例如年或小时。 source必须是timestamp,time或interval类型的值表达式。 ...以下是有效的字段名称

(我的[[重点)]

然后继续描述每个字段和可能的值。没有相反的指示符,那么,这是有关从间隔中提取字段时发生情况的文档。

而且,实际上我们看到例如day

对于timestamp值,(月)的天字段(1-31);对于interval值,天数

因此,我们可以看到,他们希望突出显示时间间隔和时间戳之间的差异,因此可以在各个字段说明中做到这一点。类似地,对于month,它们分别记录时间戳和间隔处理,因此它们似乎具有

consistent

记录差异的方式。所以,最后,我们到了quarter

日期所在的一年的四分之一(1-4)

就是这样。这就是文档,它同样适用于时间戳和时间间隔。

© www.soinside.com 2019 - 2024. All rights reserved.