Considere la siguiente consulta:
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)Se produce, para mi sorpresa:
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| Entonces, al extraer un QUARTER de un INTERVAL "normalizado" de este tipo (producido por una expresión INTERVAL '1 month' * <some integer> ), obtenemos valores 1-4 (como si esta extracción fuera de alguna manera basada en 1), mientras que extraer un YEAR o MONTH de un INTERVAL produce valores 0-N ( YEAR ) o 0-11 ( MONTH ), respectivamente.
¿Cuál es la razón detrás de este comportamiento? ¿Está documentado? (No creo que esté documentado aquí, explícitamente )
Sí, lo es.
Parece que se esfuerza por evitar una lectura simple de la documentación. La sección 9.1.1 comienza:
9.9.1. EXTRACTO, fecha_parte
EXTRACT(field FROM source)La función de extracción recupera subcampos como el año o la hora a partir de valores de fecha/hora. source debe ser una expresión de valor de tipo timestamp, time o interval . ... Los siguientes son nombres de campo válidos
(Mi énfasis )
Luego pasa a describir cada campo y los valores que son posibles. En ausencia de cualquier indicador de lo contrario, esta es la documentación de lo que sucede cuando se extraen campos de un intervalo.
Y, de hecho, vemos por ejemplo el day :
Para valores de
timestampde tiempo, el campo de día (del mes) (1 - 31) ; para valores deinterval, el número de días
Entonces, podemos ver que, cuando deseen resaltar una diferencia entre el intervalo y la marca de tiempo, pueden hacerlo en descripciones de campos individuales. De manera similar, para el month , documentan por separado la marca de tiempo y el manejo de intervalos, por lo que parecen tener una forma consistente de documentar las diferencias.
Entonces, finalmente, llegamos al quarter :
El trimestre del año (1 - 4) en el que se encuentra la fecha
Eso es todo. Esa es la documentación, y se aplica igualmente a las marcas de tiempo y los intervalos.