powered by simpleCommunicator - 2.0.20     © 2024 Programmizd 02
Map
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / npgsql timestamp with time zone
29 сообщений из 29, показаны все 2 страниц
npgsql timestamp with time zone
    #40123222
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достался тут проект с нет кор и пг.. поля с временем в бд как понятно из топика типа timestamp with time zone.
на 3.1 бахнули до меня DateTimeOffset и работало. тут решили проект перекатить на 6ку и обновили npgsql и получили
Cannot write DateTime with Kind=Unspecified to PostgreSQL type 'timestamp with time zone', only UTC is supported
открыл доку https://www.npgsql.org/doc/types/datetime.html а там просто DateTime.
Я правильно понимаю до меня ребята наворотили с DateTimeOffset и надо было изначально DateTime или это особенность что ментейнеры npgsql переписали в 6ке?
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123241
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

При работе с npgsql, ты должен работать только с UTC. При чём по барабану, DateTimeOffset у тебя, или DateTime: DateTimeOffset должно иметь смещение 0, а DateTime должен иметь Kind = Utc.

И это на самом деле очень правильно. Но может показаться несколько неожиданно.

Если коротко. Забудь про локальную дату/время. Время на сервере тебя больше никогда не должно волновать ни в каком качестве от слова _АБСОЛЮТНО_ :)

С этим связано небольшие затраты на то, чтобы обеспечить приведение времени к UTC перед записью в БД.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123242
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

Да, это последние нововведения от команды npgsql, которые в прочем можно отключить.
Но я бы не советовал. Всё правильно делают.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123254
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Всё правильно делают.

Чото у меня сомнения в их правильности. Если мне надо, например не просто указать что это 11:15 вечера 5 августа 1945 года по UTC, а 8:15 утра 6 августа 1945 по Токио, то как мне тогда быть? Если такое невозможно, то на кой фер нужна поддержка TZ в БД? Она как бы для этого и задумана.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123256
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Чото у меня сомнения в их правильности. Если мне надо, например не просто указать что это 11:15 вечера 5 августа 1945 года по UTC, а 8:15 утра 6 августа 1945 по Токио, то как мне тогда быть? Если такое невозможно, то на кой фер нужна поддержка TZ в БД? Она как бы для этого и задумана.


Поддержка TZ в БД это умение привести время при запросе к нужному часовому поясу.
Но храниться должно, строго-настрого, исключительно момент времени, т.е. UTC.
При необходимости учитывать TZ для отдельных записей, хранить его отдельным полем.

К слову, в отличие от MS SQL, у Postgres нет типа данных, который умеет хранить дату/время + смещение.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123261
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Поддержка TZ в БД это умение привести время при запросе к нужному часовому поясу.

Нет.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123262
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Поддержка TZ в БД это умение привести время при запросе к нужному часовому поясу.

Нет.


А чего ещё надо-то? :)
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123267
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
А чего ещё надо-то? :)

Если бы все было так просто, то отдельный тип данных для этого был бы не нужен - сохраняй себе все в обычном datetime в UTC и все. Но когда ты преобразовываешь время от времени с указанной таймзоной к UTC ты всегда теряешь информацию. Если у тебя сценарий где она не важна, то это пофиг, но можно придумать сценарии где она нужна и тогда тебе всё равно при этом придется каким-то ручным образом еще и таймзону хранить, а зачем эта лишняя морока, если есть готовый тип данных для этого. Я просто еще не знаю, что там за морока с PG, но MSSQL с этим работает абсолютно нормально, когда ты в БД и в БД и на клиенте используешь DateTimeOffset. Но, вообще говоря, DateTimeOffset тоже все проблемы совсем не решает, потому что таймзона это далеко не просто разница с UTC. Собственно про это много можно здесь найти: https://nodatime.org/
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123273
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
handmadeFromRu,

Да, это последние нововведения от команды npgsql, которые в прочем можно отключить.
Но я бы не советовал. Всё правильно делают.

ага я видел хаку в доке на отключение но не любитель хак впринципе.
так я понял что храниться в utc, получается он читает то потом в какой локале из utc? по настройкам конекшена или локального сервера?
hVosttDateTimeOffset должно иметь смещение 0, а DateTime должен иметь Kind = Utc

я что то должен скидывать ? не понял тут. в итоге мне надо все поля в сущностях из DateTimeOffset в DateTime перегнать, с учетом что дока говорит что у них DateTime это timestamp with time zone?
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123278
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
я что то должен скидывать ? не понял тут. в итоге мне надо все поля в сущностях из DateTimeOffset в DateTime перегнать, с учетом что дока говорит что у них DateTime это timestamp with time zone?

Чота они там намутили. Надо самому проверять, т.к. мы как раз хотели все перешерстить и на DateTimeOffset перевести. Сейчас у нас как раз в БД timestamp with TZ, на клиенте DateTime в UTC.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123286
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123445
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Если бы все было так просто, то отдельный тип данных для этого был бы не нужен - сохраняй себе все в обычном datetime в UTC и все. Но когда ты преобразовываешь время от времени с указанной таймзоной к UTC ты всегда теряешь информацию. Если у тебя сценарий где она не важна, то это пофиг, но можно придумать сценарии где она нужна и тогда тебе всё равно при этом придется каким-то ручным образом еще и таймзону хранить, а зачем эта лишняя морока, если есть готовый тип данных для этого. Я просто еще не знаю, что там за морока с PG, но MSSQL с этим работает абсолютно нормально, когда ты в БД и в БД и на клиенте используешь DateTimeOffset. Но, вообще говоря, DateTimeOffset тоже все проблемы совсем не решает, потому что таймзона это далеко не просто разница с UTC. Собственно про это много можно здесь найти: https://nodatime.org/


Сценарий где нужно хранить часовой пояс -- храним отдельно, как нужно.

А момент времени это момент времени, не больше и не меньше. Т.е. UTC.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123446
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
так я понял что храниться в utc, получается он читает то потом в какой локале из utc? по настройкам конекшена или локального сервера?


Нет. Всё UTC. И на чтение и на запись :) Чтобы приводить к нужному поясу, указываешь в запросе явно. Или приводишь на клиенте.


handmadeFromRu
я что то должен скидывать ? не понял тут. в итоге мне надо все поля в сущностях из DateTimeOffset в DateTime перегнать, с учетом что дока говорит что у них DateTime это timestamp with time zone?


Да, придётся скидывать в UTC, что DateTime, что DateTimeOffset перед записью в БД.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123447
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
БД timestamp with TZ


Стоит всё же понять, что никакого TZ там в таймстампе нет.
На эту граблю уже тысячи напоролись :)
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123449
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Стоит всё же понять, что никакого TZ там в таймстампе нет.
На эту граблю уже тысячи напоролись :)

Ах ты блин, вон оно что... Понятно, спс, что предупредил.

Так а если мне все-таки хочется хранить с таймзоной? Хоронить всякий раз руками?
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123451
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Документация ПГ божится, что ТЗ там есть.
https://www.postgresql.org/docs/9.5/datatype-datetime.html
Кому верить.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123452
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Сценарий где нужно хранить часовой пояс -- храним отдельно, как нужно.

"Как нужно" - это как в MS SQL, где все это по людски работает безо всякой ручной мастурбации :))
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123453
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka
Так а если мне все-таки хочется хранить с таймзоной? Хоронить всякий раз руками?


Да, отдельно. Например, есть филиалы в разных городах, соответственно с разным часовым поясом. Часовой пояс хранится для филиала. Не нужно хранить для каждого документа филиала смещение, хранится в одном месте.

Или. Например, у каждого пользователя свой часовой пояс, вынесенный в настройки. Берём его оттуда.


fkfka
Документация ПГ божится, что ТЗ там есть.
https://www.postgresql.org/docs/9.5/datatype-datetime.html
Кому верить.


with timezone следует читать как "учитывая часовой пояс". Такой тип не рекомендуется использовать, так как будет учитываться часовой пояс сервера -- а это очень плохо.


fkfka
"Как нужно" - это как в MS SQL, где все это по людски работает безо всякой ручной мастурбации :))


Там по сути тоже не часовой пояс, а обычное смещение. Что не совсем одно и то же, что часовой пояс. Так как не учитываются летнее/зимнее время и различные смещения в разные эпохи.

В общем, смещение это плохо.
Хранить локальное время в БД плохо.

Не делайте так :)
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123455
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть исключение из правил.

Это тип date, а также соответствующий тип в .NET DateOnly. Т.е. это календарная дата. Хорошо подходит бизнесу, например, дата договора. Пользуйтесь :)

Единственная проблема, с которой наверняка столкнётесь при использовании типа DateOnly, стандартный System.Text.Json сериализатор не умеет с ним работать :(
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123457
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Да, придётся скидывать в UTC, что DateTime, что DateTimeOffset перед записью в БД.

я перевел все поля DateTimeOffset в DateTime я хз кто с кем договорился но нет6 в памяти DateTime держит как в бд лежит т.е. UTC. а при вставке самое конвертит DateTime в UTC DateTime

п.с. вообщем по тихому не получилось перекатиться на нет6
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123458
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
я перевел все поля DateTimeOffset в DateTime я хз кто с кем договорился но нет6 в памяти DateTime держит как в бд лежит т.е. UTC. а при вставке самое конвертит DateTime в UTC DateTime


тоже норм

handmadeFromRu
п.с. вообщем по тихому не получилось перекатиться на нет6


из нашего опыта сложнее всего было перейти с EF Core 2, на 3+
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123469
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще если капнуть глубже то проблема времени капец геморная
даже скит о таком писал в далеком 2019 https://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-silver-bullet/
все в утс не решает всего гемороя
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123471
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Там по сути тоже не часовой пояс, а обычное смещение. Что не совсем одно и то же, что часовой пояс.

Да, я про это как раз писал выше.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123474
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
все в утс не решает всего гемороя


Джон Скит конечно заморочился и всё верно говорит, но его нода тайм это капец переусложнённое решение.

Всё в UTC устраняет любой гемор, так как это момент времени. Т.е. настоящее время события, которое можно привести к чему угодно, к любому локальному времени в любой эпохе.

Тут сложность не техническая, а предметная. Да, люди придумали себе гемор на задницу с переводом часов и периодической сменой смещения.

Именно поэтому нужно не ибсти мозги со всякими нодатаймами, а хранить время в UTC.
Шо тут сложного-то :)
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123475
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
даже скит о таком писал в далеком 2019 https://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-silver-bullet/


Учитывая, что серебряной пули не существует, писать как что-то тама "не серебряная пуля" выглядит немного комично.

Капец-капец, мир оказывается сложный! Радоваться надо. Это же наш хлебушек
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123480
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Всё в UTC устраняет любой гемор, так как это момент времени.

Он как раз и приводит примеры, когда потеря локального времени при пересчете в UTC может создавать геморрой. Такое конечно не так уж и часто, но вполне может быть. Я на самом деле эту его статью еще давно читал в переводе, на хабре, кажется.

А ПГ я чекнул - сцуко и правда ТЗ не сохраняет вообще . Зачем там тогда этот тип данных ввели для меня остается загадкой.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123516
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а меня больше интересует нахера в пг вообще теперь timestamp with time zone, если все прекрасно timestamp without time zone
напишу миграцию для полей теперь, раз до меня наворотили.

to hVostt нее не сложно просто на такие мелочи не хочется тратить время и удивляться)
бывает ваще веселее http://joxi.ru/krD11lYTKQEQnm
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123776
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka
Он как раз и приводит примеры, когда потеря локального времени при пересчете в UTC может создавать геморрой. Такое конечно не так уж и часто, но вполне может быть. Я на самом деле эту его статью еще давно читал в переводе, на хабре, кажется.


Там весь "геморрой" высосан из пальца :)

fkfka
А ПГ я чекнул - сцуко и правда ТЗ не сохраняет вообще . Зачем там тогда этот тип данных ввели для меня остается загадкой.


Это с тех времён, когда локальный часовой пояс на сервере что-то значил.
Сейчас правильные пацаны сразу ставят нулевое смещение по дефолту.


handmadeFromRu
а меня больше интересует нахера в пг вообще теперь timestamp with time zone, если все прекрасно timestamp without time zone


По сути пофигу. Это одно и тоже с точки зрения хранения.
...
Рейтинг: 0 / 0
npgsql timestamp with time zone
    #40123815
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

handmadeFromRu
а меня больше интересует нахера в пг вообще теперь timestamp with time zone, если все прекрасно timestamp without time zone


По сути пофигу. Это одно и тоже с точки зрения хранения.

да о том и речь что путает просто.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / npgsql timestamp with time zone
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]