[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PostgreSQL поля типа timestamp
zvezda_t
Всем привет!

Скажите, пожалуйста, какое поле лучше использовать
timestamp [ without time zone ]
или
timestamptz [with time zone] ?

Обратила внимание, что для этих полей возвращается разное значение временной метки (количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT) до текущего времени).
С чем это связано?

Задача состоит в следующем:
Необходимо сохранять дату в БД в едином часовом поясе для всех пользователей.
А выводить каждому пользователю дату, в соответствии с его часовым поясом.

Хочу реализовать, следующим образом:
1) Получать из БД дату в виде метки времени:
SELECT extract(epoch from date) as date_ts FROM table;

Но здесь, есть проблема:
Если указываю поле timestamp, то метка времени возвращается со смещением.
Например в ячейке записано:
20.03.2013 16:58:24
А метка времени возвращается = 1363798704, вместо 1363777104.
Вот почему так?

2) для каждого пользователя устанавливать его зону:
date_default_timezone_set('Europe/Moscow');


3) преобразовывать дату из БД следующим образом:
date('d.m.Y H:i:s', $row['date_ts']);

Скажите, пожалуйста, насколько это правильно?



_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
bestxp
одна учитывает временную зону другая нет, вот и всё
zvezda_t
bestxp, а почему, когда я из текстового поля такое же преобразование делаю - то временная зона учитывается?


Select extract(epoch from date) as date_ts from table; --в ячейке date=2013-03-20 16:58:24

результат = 1363798704

Select extract(epoch from to_timestamp('2013-03-20 16:58:24','YYYY-MM-DD HH24:MI:SS')) as ts;

результат = 1363777104

Почему в этих двух случаях - разный результат?


Select extract(epoch from date_z) as date_tsz from table;--в ячейке date = 2013-03-20 16:58:24+06

результат = 1363777104
Почему при добавлении значения в ячейку типа timestamptz [with time zone], к значению добавляется "+06"? Где посмотреть эту настройку?
show timezone;

показывает = YEKT-5YEKST
логичнее было бы тогда, если бы добавилось "-05", не так?

_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
bestxp
Для начала здесь почитай
Если не поможет будем смотреть уже по обстоятельствам

http://www.opennet.ru/tips/1810_timezone_date_time.shtml
zvezda_t
bestxp, это я уже видела smile.gif

Получается, что мне вообще не нужно выводить из БД метку времени в виде extract(epoch from timestamp) и не нужно потом обрабатывать её в пхп, прибавляя часовой пояс?

А нужно для каждого пользователя установить свою timezone и выводить адекватную часовому поясу дату сразу из БД?
Все верно?

Скажите пожалуйста, а в самой БД какая timezone установлена имеет значение?
Можно в БД поставить мою региональную зону? Или в БД timezone лучше поставить UTC = 00?
Или это вообще не имеет значения?

_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
bestxp
Если смотреть так, то часовой пояс в бд по умолчанию должен тот который ты используешь и который хочешь использоваться,
когда идет сохранение в поле с tz , то сохраняется та которая была установлена, и её записывает, после нужно преобразование.


У меня в бд такая структура,
например поле
date_create timestamp without time zone, при сохранении делаю date_create = NOW()

время показывает адекватное, то есть то где я нахожусь

но с самими часовыми поясами не сталкивался, как таковыми, наверно тебе сначало стоит добиться того что бы показывало дату относительно тебя.

Проверь часовой пояс установленный на сервере если это твой, либо уточни у хостера, так же как и часовой пояс устаовленный в бд.

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


UPD

PS первая проверка

Select now()::timestamp; -без часового
Select now()::timestamptz; -c часовым

совпадает ли с нужным тебе временем, то есть у меня это Москва, и показывает текущее время в обоих случаях

А вот потом уже пробывать настройки делать далее
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.