feat(ddl): пояс назван явно — в типах колонок и в разборе строки
- Зачем: - конвенция #63 записана, а код её не достиг: колонки времени стояли без пояса, и сходилось всё лишь потому, что пояс сервера — UTC. - Что: - UTCEventTime объявлен DateTime('UTC'), служебные метки _load_ts и kafka_timestamp — DateTime64(3, 'UTC') в STG и ODS. - parseDateTimeOrNull получил третьим аргументом 'UTC': маска сверяет суффикс Z как букву, зоны из строки не берёт вовсе. - контракт схемы и описание выгрузки несут тип с поясом; имя пояса Europe/Samara встало рядом со смещением в world.py, сходимость сверяет тест. - учебный комментарий о линзе — у первой колонки с явным поясом. - Проверка: - make lint, make typecheck, make test (408 тестов) - make clean && make up && make check-clickhouse — 9 из 9 - замер тикета повторён: под session_timezone='Europe/Samara' колонка показана 2026-05-31 23:37:00, как и без настроек Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -107,7 +107,7 @@ COLUMNS: tuple[Column, ...] = (
|
||||
),
|
||||
Column(
|
||||
name="UTCEventTime",
|
||||
clickhouse_type="DateTime",
|
||||
clickhouse_type="DateTime('UTC')",
|
||||
numpy_dtype="datetime64[s]",
|
||||
normalized_name="utc_event_time",
|
||||
group=ColumnGroup.IDENTIFIERS,
|
||||
|
||||
@@ -16,11 +16,15 @@ from datetime import date
|
||||
# Счётчик стенда: сайт один, номер — константа мира.
|
||||
COUNTER_ID = 42150607
|
||||
|
||||
# Часовой пояс счётчика, минуты от UTC: Самара, UTC+4. Модельные сутки
|
||||
# считаются в этом поясе, как в выгрузке Метрики: `EventDate` — дата в поясе
|
||||
# счётчика, `UTCEventTime` — абсолютная метка. Отсюда следствие, о котором
|
||||
# сторона хранилища должна знать заранее: `toDate(UTCEventTime)` ≠ `EventDate`
|
||||
# у ночных событий (спека генератора, раздел 9).
|
||||
# Часовой пояс счётчика — Самара, UTC+4 — записан двумя способами, потому что
|
||||
# стороны просят разное. Генератору нужны минуты: в этом поясе считаются
|
||||
# модельные сутки, как в выгрузке Метрики — `EventDate` дата в поясе счётчика,
|
||||
# `UTCEventTime` абсолютная метка. Отсюда следствие, о котором сторона
|
||||
# хранилища должна знать заранее: `toDate(UTCEventTime)` ≠ `EventDate` у ночных
|
||||
# событий (спека генератора, раздел 9). Хранилищу нужно имя из базы поясов: его
|
||||
# просят `toDate` и типы колонок DDS (docs/architecture/storage.md, «Часовые
|
||||
# пояса»).
|
||||
COUNTER_TIMEZONE = "Europe/Samara"
|
||||
COUNTER_TIMEZONE_MINUTES = 240
|
||||
|
||||
# D0 — первый день оси модельного времени, понедельник. Реальный календарь в
|
||||
|
||||
Reference in New Issue
Block a user