9404
Чат русскоязычного сообщества PostgreSQL, здесь мы обсуждаем технические вопросы, для поиска работы и предложения вакансий есть группа https://t.me/pgsqljobs For English discussion visit https://t.me/pg_sql
в дальнейшем, нужно определить только рабочее время - это уже другая задача.
Читать полностью…
Зачем, для решения какой задачи? ;)
Это время и так изоморфно тому времени, которое было у пользователя (точнее, это буквально одно и то же).
Почему? Это offset, который был у пользователя, от которого приехало значение временной метки (и оно никак не связано с вами, и никак не связано с меткой в формате UTC/GMT с нулевым смещением, т.е. про него можно "забыть").
Пример:
Сейчас я в Нью-Йорке, у меня локальное время 05:17 утра (и оно в формате GMT-04:00, таков уж там часовой пояс). Я пришел к вам в сервис и он записал моё время. Получилось:
created_on = 09:17, offset = GMT-04:00
Однако, если вы created_on приведете к timestamptz корректно и выведете у себя, вы получите 12:17, т.е. московское время (GMT+03:00).
Я ожидаю, что к столбцу created_on прибавиться время как в offset. Если посмотреть на стручку где оффсет +7, то там тоже прибавляет +3 часа
Читать полностью…
Ну смотрите, мы с помощью AT TIME ZONE 'UTC' показываем, что в этом столбце с типом timestamp хранится временная метка в формате UTC/GMT. После оного приведения этот столбец (ну, текущее выражение, точнее) становится типа timestamptz и далее он выводится на клиент в локальном формате времени (в вашем случае по Москве, т.е. в UTC/GMT+03) — стандартное поведение для типа timestamptz.
Иначе говоря, то, что везде "прибавляется 3 часа" — так и должно быть на вашем клиенте, ведь теперь время отображается не как UTC, а как UTC+3 (в локальном для вас формате).
не знал. =) должно подойти.
я краем мозга вспомнил линуксовый tr, когда возился, но тут же и забыл.
И как насчет:
SELECT translate(ts, '+-', '-+')
и это поправить у меня получилось только через уродливый CASE. пример:
postgres=# WITH tz AS (SELECT unnest(ARRAY['GMT-03:00', 'GMT+08:00']) AS offset) SELECT CASE WHEN "offset" ~ '^GMT\+' THEN replace(tz."offset", '+', '-') WHEN "offset" ~ '^GMT\-' THEN replace(tz."offset", '-', '+') END FROM tz;Читать полностью…
replace
-----------
GMT+03:00
GMT-08:00
(2 rows)
Time: 0,986 ms
Потому что 05:08GMT+05 это 00:08GMT, и это тоже самое что 03:08GMT+03. Формально, не то чтоб поэтому, но так работают часовые пояса, да (по определению формы этой записи).
Но, давайте начнем с малого: в столбце created_on указано локальное время, или же время в UTC/GMT (без всякого смещения, т.е., приведено специальным образом к этому формату)? Это кардинально меняет дальнейшие шаги. Изначально я его интерпретирую как первый случай, но может зря...
Почему ж вы так решили то? Всё правильно он показывает (если у вас в столбце created_on не время в UTC/GMT, а локальное, конечно).
Напр., 05:08GMT+05 это как раз 03:08GMT+03, как в вашей выделенной синим строке.
(c.created_on || replace (tz.offset, 'GMT',''))::timestamptz as created_on2 — не работает,
c.created_on::timestamp AT TIME ZONE 'GMT' AT TIME zone replace (tz.offset, '+','-') as created_on3 - работает
а как такое можно поправить, в offset заменить + на - ? 😳
Читать полностью…
c.created_on::timestamp AT TIME ZONE 'GMT' AT TIME zone tz.offset — почему то переводит наоборот где прибавить - отнимает
Читать полностью…
в целом этот скрипт работает c.created_on::timestamp AT TIME ZONE 'GMT' AT TIME zone translate (tz.offset, '+-','-+')
Читать полностью…
Мне московское время не нужно, нужно время места где был пользователь
Читать полностью…
Что вас смущает? Вместо немого скриншота всегда рекомендую указывать ожидаемый результат и почему вы его ожидаете (а скриншот зачтем за "актуальный").
Читать полностью…
У вас created_on это столбец timestamp или timestamptz?
Читать полностью…
Коллега уверяет, что в столбце created_on уже приведенное время к UTC/GMT, т.е. столбец offset вообще не требуется для работы с этим временем как таковым.
Читать полностью…
Хм, так тогда достаточно сделать:
created_on AT TIME ZONE 'UTC'
что-то я не понимаю, почему 05:08GMT+05 это не 10ч?
Читать полностью…
да, в вашем случае работает.
есть одна проблема: если у вас в tz.offset записано, к примеру, GMT-08:00 (или любой другой оффсет с GMT-), то это не сработает.
Так я вам выше костыльный вариант привел — но он работает (тот, что с replace).
С другой стороны, я бы обратился к тому, что "выдумал" такую сомнительную схему хранения зоны (и оправдал её хранение в целом) с вопросом, как он собирался с этим работать.
А по мне так сейчас всё правильно. В результате вы видите значение timestamptz в локальном формате вашего "клиента" — который тоже со смещением +3.
Читать полностью…