Mysql 2 поля timestamp или 2 поля datetime

ipv

Новичок
Добрый день, уважаемые участники форума! Есть сервис, на котором пользователи создают и участвуют в тендерах. Собственно, есть таблица, содержащая основную информацию по этим тендерам. Помимо прочих, таблица содержит 2 поля: date - дата создания тендера, и date_closed - дата закрытия тендера. Оба поля типа DATE. Недавно подумал, что было бы не плохо показывать время, когда был создан или закрыт тендер. Для этого уже сделали доработку, и теперь мы знает тайм зону пользователя (они их разных регионов РФ) и можем делать запрос к БД с учётом часового пояса юзера. Но вот проблема - никак не удается понять, как теперь перестроить таблицы, а также процесс записи новых тендеров, обновления инфы и закрытия тендеров.

С добавлением новой записи более или менее понятно - есть сделать поле date по типу timestamp default CURRENT_TIMESTAMP, то про это поле можно забыть, поскольку оно будет работать на автомате. Но как в этом случаем быть с полем date_closed - когда пользователь закрывает тендер, как добиться, чтобы в этот момент это поле обновлялось до текущей даты и времени? Накопал конструкцию "TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", но как теперь добавить эту запись к существующему полю? Или может вообще отказаться от timestamp в полю datetime - просто перед вставкой новой записи (и при закрытии тендера) переводить дату в unix_timestamp и записывать в таком виде, а выводить уже в поправкой на часовой пояс юзера? Спасибо.
 

hell0w0rd

Продвинутый новичок
А в чем проблема? Если пользователь вводит время в зоне Europe/Moscow - переводите ее в UTC и обновляете таблицу.
Вместо UTC подставьте ту зону, которая используется у вас на сервере
 

ipv

Новичок
hell0w0rd, здесь вопрос в другом - как корректно (чтобы потом работало) заменить 2 поля типа DATE в таблице на тип TIMESTAMP. Проблема в том, что не удается добавить 2 поля типа TIMESTAMP, чтобы в одно поля добавлялась текущая дата и время при добавлении новой записи, а в другое поля при обновлении этой записи. Вот, например, такая запись не работат -
create table blabla(
`updated` timestamp on update current_timestamp,
`created` timestamp default now()
)

Вот что выдает мускул - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause)

А у меня по сути такая же задача - удалить 2 старых поля и добавить 2 новых (по типу)
 

Absinthe

жожо
Мне не нравится идея работы в часовом поясе клиента.
Часовой пояс клиента (точнее, его отображение) - это вид. Не надо пихать код вида в модель.
 

hell0w0rd

Продвинутый новичок
Absinthe, даже так?
PHP:
public function setClosedDate(\DateTime $date)
{
    $date->setTimezone($this->getCurrentTimezone());
    $this->closedDate = $date;
}
Хотя да, по хорошему это делать в репозитории
 

WMix

герр M:)ller
Партнер клуба
открылся в 9 закрылся в 16 кого интересует что во время закрытия в мазамбике была полночь? если у каждого пользователя прописать зону то парню из якутска можно написать открылся в 15 закрылся в 21
 

artoodetoo

великий и ужасный
Можно я "покапитаню" маленько?

NOW() он и в Африке NOW(). Нюанс может возникнуть только когда значение времени приходит с клиентской стороны. Тогда его надо приводить ко времени сервера.

На всякий случай добавлю: тип TIMESTAMP хранит данные в UTC. А тип DATETIME и DATE хранят данные "как указано".
Текстовое представление времени для TIMESTAMP вычисляется с поправкой на сессионный time_zone.
Если вдруг мы поправим time_zone, то увидим, что представление времени у полей типа TIMESTAMP изменилось, а у DATETIME осталось прежним.

Вы можете вспомнить об этом когда база переедет на сервер в другой зоне.
 

artoodetoo

великий и ужасный
читай весь пост
при присвоении его TIMESTAMP это не играет роли — читай весь пост )))
 
Сверху