postgresql的extract(来自< interval>的季度)是基于1的吗?

yrwegjxp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(213)

考虑以下查询:

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 或者 MONTH 从一个 INTERVAL 生成值 0-N ( YEAR )或者 0-11 ( MONTH )分别是。
这种行为背后的基本原理是什么?有没有记录在案(我不认为这里有明文规定)

vi4fp9gy

vi4fp9gy1#

是的。
你似乎在千方百计避免通读文档。第9.1.1节开始:
9.9.1. 摘录,日期\u部分

EXTRACT(field FROM source)

extract函数从日期/时间值中检索诸如年或小时之类的子字段。源必须是timestamp、time或interval….类型的值表达式。。。以下是有效的字段名
(我的重点)
然后描述每个字段和可能的值。如果没有任何相反的指标,那么,这就是从区间提取字段时发生的情况的文档。
事实上,我们看到了一个例子 day :
为了 timestamp 值,日期字段(1-31);为了 interval 值,天数
所以,我们可以看到,如果他们希望突出显示间隔和时间戳之间的差异,他们可以在单独的字段描述中这样做。同样适用于 month 它们分别记录时间戳和间隔处理,因此它们似乎有一种一致的记录差异的方法。
所以,我们终于可以 quarter :
日期所在的季度(1-4)
就这样。这就是文档,它同样适用于时间戳和间隔。

相关问题