В таблице будут содержаться поля:
- date — дата
- year — год
- quarter — номер квартала
- month — номер месяца
- year_day — номер дня в году
- month_day — номер дня в месяце
- week_day — номер дня в неделе
- month_name — название месяца года
- week_day_name — название дня недели
DDL запрос для создания таблицы
-- DROP TABLE default.calendar;
CREATE TABLE default.calendar(
`date` Date NOT NULL
, `year` UInt32 NOT NULL
, `quarter` UInt8 NOT NULL
, `month` UInt8 NOT NULL
, year_day UInt16 NOT NULL
, month_day UInt8 NOT NULL
, week_day UInt8 NOT NULL
, month_name String NOT NULL
, week_day_name String NOT NULL
)
ENGINE = MergeTree()
ORDER BY `date`;
DML запрос для наполнения таблицы
INSERT INTO default.calendar
WITH
toStartOfDay(toDate('2020-01-01')) AS start,
toStartOfDay(toDate('2031-01-01')) AS end
SELECT
date
, toYear(date) AS `year`
, toQuarter(date) AS `quarter`
, toMonth(date) AS `month`
, toDayOfYear(date) AS year_day
, toDayOfMonth(date) AS month_day
, toDayOfWeek(date) AS week_day
, (CASE
WHEN `month` = 1 THEN 'Январь'
WHEN `month` = 2 THEN 'Февраль'
WHEN `month` = 3 THEN 'Март'
WHEN `month` = 4 THEN 'Апрель'
WHEN `month` = 5 THEN 'Май'
WHEN `month` = 6 THEN 'Июнь'
WHEN `month` = 7 THEN 'Июль'
WHEN `month` = 8 THEN 'Август'
WHEN `month` = 9 THEN 'Сентябрь'
WHEN `month` = 10 THEN 'Октябрь'
WHEN `month` = 11 THEN 'Ноябрь'
WHEN `month` = 12 THEN 'Декабрь'
END) AS month_name
, (CASE
WHEN week_day = 1 THEN 'Понедельник'
WHEN week_day = 2 THEN 'Вторник'
WHEN week_day = 3 THEN 'Среда'
WHEN week_day = 4 THEN 'Четверг'
WHEN week_day = 5 THEN 'Пятница'
WHEN week_day = 6 THEN 'Суббота'
WHEN week_day = 7 THEN 'Воскресенье'
END) AS week_day_name
FROM
(SELECT
arrayJoin(arrayMap(x -> toDate(x), range(toUInt32(start), toUInt32(end), 24 * 3600))) as date);