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:
@@ -218,7 +218,7 @@ ClickHouse 26.3.17.56. Все четыре ответили так, как жд
|
||||
`2026-06-01` и разбирается `JSONExtract` без оговорок.
|
||||
|
||||
Разбор метки времени идёт
|
||||
`parseDateTimeOrNull(JSONExtractString(raw, 'UTCEventTime'), '%Y-%m-%dT%H:%i:%SZ')`
|
||||
`parseDateTimeOrNull(JSONExtractString(raw, 'UTCEventTime'), '%Y-%m-%dT%H:%i:%SZ', 'UTC')`
|
||||
— по буквально названному формату, а не через `parseDateTimeBestEffort`.
|
||||
Обе функции ISO-8601 понимают и обе в варианте `*OrNull` отдают NULL вместо
|
||||
исключения, то есть годятся в предикат. Выбран точный формат потому, что
|
||||
@@ -232,10 +232,11 @@ ClickHouse 26.3.17.56. Все четыре ответили так, как жд
|
||||
всех трёх NULL. Источник у топика один и шлёт одну запись, так что широта не
|
||||
нужна вовсе, а платится за неё отключённой проверкой.
|
||||
|
||||
Пояс разбору при #63 добавлен третьим аргументом — `'UTC'`; вызов выше приведён
|
||||
без него, каким он был до этого решения. Без имени пояса функция трактует
|
||||
показания часов по поясу сессии, а тот по умолчанию серверный. Правило целиком
|
||||
и его довод — [конвенция часовых поясов](../architecture/storage.md).
|
||||
Третий аргумент — имя пояса, `'UTC'` — пришёл с конвенцией #63. Маска сверяет
|
||||
суффикс `Z` как букву и выбрасывает, зоны из строки не берёт вовсе, поэтому без
|
||||
имени функция трактует показания часов по поясу сессии, а тот по умолчанию
|
||||
серверный. Правило целиком и его довод — [конвенция часовых
|
||||
поясов](../architecture/storage.md).
|
||||
|
||||
Цена выбора измерена на настоящих данных: по всем 101 252 строкам сырья
|
||||
модельного дня (день залит дважды) точный формат разобрал метку у каждой, и
|
||||
|
||||
Reference in New Issue
Block a user