Получить номер месяца в квартале
Ломаю голову над задачей: хочу получить номер месяца в рамках квартала. Номер должен быть от 1 до 3.
У меня есть сгенерированая последовательность дат в которых нужно посчитать номер месяца в каждом квартале. Я придумал обходить проблему череp case
Но может кто нибудь может подсказать или направить на более оптимальное решение?
Задачу решаю в Redshift.
Фрагмент запроса:
SELECT date '2014-12-31' + INTERVAL AS date_s,
CASE
WHEN DATE_PART(dayofweek, date_s) = 0
THEN 7
ELSE DATE_PART(dayofweek, date_s)
END AS dwn,
DATE_PART(day, date_s) AS dmn,
(date_s- DATE_TRUNC('quarter', date_s)::date) + 1 AS day_of_quarter,
EXTRACT(doy from date_s) AS day_of_yer,
CASE
WHEN EXTRACT(month FROM date_s) = 4
THEN 1
WHEN EXTRACT(month FROM date_s) = 5
THEN 2
WHEN EXTRACT(month FROM date_s) = 6
THEN 3
WHEN EXTRACT(month FROM date_s) = 7
THEN 1
WHEN EXTRACT(month FROM date_s) = 8
THEN 2
WHEN EXTRACT(month FROM date_s) = 9
THEN 3
WHEN EXTRACT(month FROM date_s) = 10
THEN 1
WHEN EXTRACT(month FROM date_s) = 11
THEN 2
WHEN EXTRACT(month FROM date_s) = 12
THEN 3
ELSE EXTRACT(month FROM date_s)
END AS month_quarter_number
FROM generate_series(1, (date '2021-01-01' - date '2015-01-01')) interval;
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Можно вычислить номер месяца в квартале при помощи остатка при делении на 3
(EXTRACT(month FROM date_s) - 1) % 3 + 1
Может понадобиться явное приведение типа:
(EXTRACT(month FROM date_s)::int - 1) % 3 + 1
SELECT
date '2014-12-31' + INTERVAL AS date_s,
CASE
WHEN DATE_PART(dayofweek, date_s) = 0 THEN 7
ELSE DATE_PART(dayofweek, date_s)
END AS dwn,
DATE_PART(day, date_s) AS dmn,
(date_s- DATE_TRUNC('quarter', date_s)::date) + 1 AS day_of_quarter,
EXTRACT(doy from date_s) AS day_of_yer,
(EXTRACT(month FROM date_s)::int - 1) % 3 + 1 AS month_quarter_number
FROM
generate_series(1, (date '2021-01-01' - date '2015-01-01')) interval;