184 похожих чатов

Всем здравствуйте! Кто может мне объяснить, почему select timezone() as tz, toDate(0)

as date0, toDateTime(toDate(0)) as datetime0
возвращает
Europe/Moscow 1970-01-01 1970-01-02 00:00:00
Почему datetime0 2-е Января?
Версия 22.10.7.13.

13 ответов

25 просмотров

https://fiddle.clickhouse.com/7b2a230d-b600-407a-a5f1-6e28a00e471d похоже какой то ньанс или баг с конвертацией из Date в DateTime

Николай-Чернов Автор вопроса
Slach [altinity]
https://fiddle.clickhouse.com/7b2a230d-b600-407a-a...

Да, вот бы знать, нюанс это или баг?...

Slach [altinity]
https://fiddle.clickhouse.com/7b2a230d-b600-407a-a...

Да какой ещё баг. UTC это Лондон. Время начинается с 0. В Москве такое время не существует.

Николай Чернов
Да, вот бы знать, нюанс это или баг?...

Это не баг. Время datetime 0 не существует в Москве.

Denny [Altinity]
Да какой ещё баг. UTC это Лондон. Время начинается...

это в Канаде такого времени еще не существует... ;) а в Москве это UTC+3 / UTC+4 (когда было летнее время) и сейчас просто UTC+4 (пока очередной нелюдь в думе не захочет себя в историю записать) и соответственно 0 unixtime должно по идее быть 1970-01-01 03:00:00 UTC+3 посмотри вот сюда https://fiddle.clickhouse.com/a2e3b3c0-8e63-4cb7-89a5-74a946760028 почему toDateTime(toDateTime(0), 'Europe/Moscow'): 1970-01-01 03:00:00 нормально сконвертировал 0 DateTime в +3 UTC но при этом если на вход Date toDateTime(toDate(0), 'Europe/Moscow'): 1970-01-02 00:00:00 то уже конвертация идет как то по другому, округление какое то? то есть в чем разница в toDateTime когда в него прилетает Date и DateTime первым параметром?

Slach [altinity]
это в Канаде такого времени еще не существует... ...

Так они хотят 19700000000 по Москве, это -4 часа в utc

Denny [Altinity]
Так они хотят 19700000000 по Москве, это -4 часа в...

они хотят ответ на вопрос > select timezone() as tz, toDate(0) as date0, toDateTime(toDate(0)) as datetime0 > возвращает > Europe/Moscow 1970-01-01 1970-01-02 00:00:00 > Почему datetime0 2-е Января? toDate(0) тут по идее внутренний 0 (кол-во дней с 1970-01-01), с систеным TZ UTC+3 ? так? https://clickhouse.com/docs/en/sql-reference/data-types/date DateTime это unixtime 32bit внутри плюс системная TZ, либо явно TZ в типе задана и по идее она там тоже должна только для вывода и парсинга строк использоваться, но не при конвертации https://clickhouse.com/docs/en/sql-reference/data-types/datetime#usage-remarks при попадании на вход в toDateTime поля Date без указании TZ, происходит конвертация... из внутреннего представления Date 0 + системная TZ. в во внутренее представление DateTime - unixtime + системная TZ и вот кажется что внутреннее представление toDate тут по особому интерпретируется то есть при переводе из 0 дней в Date типе во внутренний unixtime типа DateTime оно либо должно учитывать системный TZ либо игнорировать его (потому что оба типа без TZ) выглядит так, что игнорируется потому что вот тут https://fiddle.clickhouse.com/ceb038a4-8b10-43d2-ad6f-c70a8a566077 поведение не изменяется при смене серверной timezone но как то странно, как именно тогда получается 1970-01-02 ?

Slach [altinity]
они хотят ответ на вопрос > select timezone() as ...

Там -3600*4 то округляется в 0 то в 1. По разному. Там и 2106 можно получить

Denny [Altinity]
Там -3600*4 то округляется в 0 то в 1. По разному....

откуда -3600*4 то взялось? если в 1971 было -3600*3? и это при конвертации toDate(0) в DateTime представление? почему тогда при изменении timezone конвертация toDate(0) не поменялась? если внутри Date это все равно будет 0? потому что кол-во дней для toDate(0) это все равно 0 для UTC+3 таймозоны в днях, разве не так?

Slach [altinity]
они хотят ответ на вопрос > select timezone() as ...

2 января, потому что это сплошное undefined behaviour. Если бы там было 42 февраля 1985 года, я бы точно также не удивлялся. И это не баг. ты зря думаешь об этом как о числах uint32 / uint16. LUT таблица это не формула. toDateTime(toDate(0), 'Asia/Tokyo'): 2106-02-07 06:28:16

Denny [Altinity]
2 января, потому что это сплошное undefined behavi...

а какая версия? какой SELECT timezone() ? а то у меня все время другое значение

Slach [altinity]
а какая версия? какой SELECT timezone() ? а то у ...

какой-то старый КХ. но это все не важно. Оно работает как и задумано. Если сильно надо, то надо использовать datetime64

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта