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

Добрый день Для вывода графиков в веб-приложении я функцией generate_series генерирую

даты от и до с интервалом в 1 день, затем лефтджойню табличку с данными (нужно показать кол-во добавленных записей по дням) и группирую по дате

Все бы ничего, если бы не часовые пояса. В самой базе данные хранятся в UTC, но при коннекте с веб-приложения я делаю SET TIMEZONE = пользовательская таймзона и из-за этого по дате данные джойнятся некорректно

Что посоветуете?

25 ответов

20 просмотров

> В самой базе данные хранятся в UTC, Изменить вот это на нормальное хранение (или придётся мучиться). В сторону: что-то сегодня прямо день неправильно работающих с timestamp-ами. ;)

Oleg-Kuzmenko Автор вопроса
Yaroslav Schekin
> В самой базе данные хранятся в UTC, Изменить во...

А чем хранение в UTC не нормальное, если к БД коннектятся из разных частей мира?

Oleg Kuzmenko
А чем хранение в UTC не нормальное, если к БД конн...

https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_timestamp_.28without_time_zone.29 Вообще прочитайте весь этот раздел.

Oleg-Kuzmenko Автор вопроса
Yaroslav Schekin
https://wiki.postgresql.org/wiki/Don%27t_Do_This#D...

Я уже как-то долго с одним человеком спорил об этом (рассматривая конкретно мой случай) и в итоге он согласился, что я прав. Это было долго, я не готов повторять это снова 🙂

Oleg Kuzmenko
Я уже как-то долго с одним человеком спорил об это...

Это просто потрясающе. Т.е. у Вас проблемы с тем, что при правильном подходе было бы тривиально, но Вы правы? ;) > и в итоге он согласился, что я прав А никто, кто знает, как работать с датой/временем, не согласился бы, понимаете? Просто для информации: приведённая ссылка — это не предмет для спора, это описание правильных подходов.

Oleg-Kuzmenko Автор вопроса
Yaroslav Schekin
Это просто потрясающе. Т.е. у Вас проблемы с тем, ...

Спасибо, это познавательно в любом случае

Oleg Kuzmenko
Спасибо, это познавательно в любом случае

Не за что. Вы могли бы, конечно, показать \d таблицы / пример данных / нужного результата — всё это вполне решаемо и при неправильном хранении, только писать [намного] больше, и ошибиться куда легче.

Oleg-Kuzmenko Автор вопроса
Yaroslav Schekin
Не за что. Вы могли бы, конечно, показать \d табли...

Я вам, кстати, тоже могу ответить ссылкой с авторитетного ресурса (42 плюсика напротив коммента, все же, о чем-то говорит): https://dba.stackexchange.com/questions/59006/what-is-a-valid-use-case-for-using-timestamp-without-time-zone Это я не пытаюсь сказать, что вы не правы, просто бывают случаи, когда уместно хранить без таймзоны и у меня как раз тот случай

Oleg Kuzmenko
Я вам, кстати, тоже могу ответить ссылкой с автори...

Кхе-кхе. Во-первых, "90% оf Stack overflow answers is BS." © И даже там: "Now, with those two down, I can came with only one good reason to use timestamp WITHOUT time zone. That is when you want to store events in the future and that some kind of alert must be triggered when we got to that time." — и это тоже неправильно, строго говоря (но почти всегда "сойдёт"). Во-вторых, правильность определяется не общественным мнением, авторитетом и т.п. ерундой. ;) Но даже если Вы падки на такие вещи, Вы сравниваете статью от сообщества PostgreSQL, написанную и проверенную, в том числе, несколькими основными разработчиками, с ответами "левых" людей и их "авторитетными" голосами. > когда уместно хранить без таймзоны и у меня как раз тот случай К хранению / работе с "гражданским" временем в прошлом есть только один правильный подход (что касается планируемых событий — см. выше), и весь postgres "заточен" именно на него (используя что-то другое, Вы будете бороться с postgres, и наступать на грабли в неожиданных местах... как будто в timestamps самих по себе мало трудностей). Чем Ваш случай такой уникальный, ради любопытства?

Yaroslav Schekin
Кхе-кхе. Во-первых, "90% оf Stack overflow answers...

А чем при работе с timestamptz объясняется тот момент, что при корректно настроенной на клиенте time zone, полностью совпадающей с time zone клиента, время в столбце с типом timestamptz не является реальным временем?

Iurii Shaporenko
А чем при работе с timestamptz объясняется тот мом...

Я не понял вопроса. Что Вы имеете в виду?

Yaroslav Schekin
Я не понял вопроса. Что Вы имеете в виду?

Клиентский часовой пояс — Новосибирск. Серверный — аналогично. Корректное значение sent_at — 8 с копейками часов утра

Iurii Shaporenko
screenshot

Вы можете текстом показать?

Iurii Shaporenko
screenshot Клиентский часовой пояс — Новосибирск. Серверный —...

Уберите каст к timestamptz, сделайте timestamp at time zone ...

Farit Shamardanov
Уберите каст к timestamptz, сделайте timestamp at ...

Оно есть, это второй столбец как раз. Данные без явного указания часового пояса и с ним разные

Iurii Shaporenko
Оно есть, это второй столбец как раз. Данные без я...

Вот так, к примеру, это должно выглядеть: SELECT now() AS sent_at_tz, now()::timestamptz AT time zone 'Asia/Novosibirsk' AS sent_at__with_tz_given, now()::timestamp AS sent_at_no_tz; sent_at_tz | sent_at__with_tz_given | sent_at_no_tz -------------------------------+----------------------------+---------------------------- 2021-07-02 18:48:43.506828+03 | 2021-07-02 22:48:43.506828 | 2021-07-02 18:48:43.506828 Обратите внимание на формат каждого поля — все timestamptz обязаны включать time zone при выводе, если её нет — что-то портит этот самый вывод.

Yaroslav Schekin
Вот так, к примеру, это должно выглядеть: SELECT n...

Я вам еще более забавный артефакт могу показать SELECT now() AS now, now()::text as now_text 02.07.2021 21:53:09 2021-07-02 22:53:09.227937+07

Iurii Shaporenko
Я вам еще более забавный артефакт могу показать S...

Это явный "косяк" клиента, больше ничего — выкиньте его в мусорное ведро найдите, как там это настраивается. ;)

Yaroslav Schekin
Это явный "косяк" клиента, больше ничего — выкиньт...

Зря вы так на Aqua Data Studio — ничего более удобного для выгрузок большого объема данных напрямую в Excel или сортировки этих уже полученных данных без повторного выполнения запроса внутри самой IDE (как это делают условные DataGrip, Toad, да тот же pgAdmin) и без необходимости листать эти результаты батчами по 100/500/1000/другое_очень_маленькое_количество строк Но вот это, видимо, действительно артефакт, и придется в конфигах копаться. Хотя, опять-таки, непонятно, почему одна и та же IDE на разных машинах ведет себя по-разному

Iurii Shaporenko
Зря вы так на Aqua Data Studio — ничего более удоб...

Ну это уж кому что нравится, но проблема-то есть...

Yaroslav Schekin
Ну это уж кому что нравится, но проблема-то есть.....

Покопался в issues у производителя IDE, нашел там ссылочку на postgresql.org, где такое поведение объясняется поведением java.sql.Time https://www.postgresql.org/message-id/alpine.BSO.2.00.1005190257480.27053@leary.csoft.net

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта