Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Хранение даты и времени в mysql


Автор: MystDeim 21.10.2008, 10:15
Никак не могу выбрать как лучше хранить в TIMESTAMP или INT  smile 

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

Автор: Kesh 21.10.2008, 10:30
MystDeim, timestamp

Автор: SamDark 21.10.2008, 12:15
Храню в int, приведённый к GMT +0;

Автор: SelenIT 21.10.2008, 13:31
Неправильная постановка вопроса. Надо спрашивать не "кто что использует", а "что лучше использовать для такой-то задачи, при таких-то ожидаемых условиях". У каждого способа свои плюсы, минусы и ограничения - например, для записи дат рождения юзеров вообще лучше брать DATETIME, чтоб наверняка не знать проблем с датами до 1970 г. (да и после 2038 - кто знает, сколько проживет эта база?). А если, к примеру, это статистика использования чего-либо, и нужно определить самые активные часы летом - вообще есть смысл разнести дату и время по отдельным полям (DATE и TIME соотв-но), да повесить на каждое отдельный индекс (иначе при сложной выборке база вполне может сказать "шпок";)...

TIMESTAMP наиболее удобен там, для чего предназначен - для "автомаркировки" времени добавления записи в таблицу (только при апдейтах с ним нужно быть осторожным!). INT есть смысл применять в переносимых решениях - чтобы все настройки, связанные со временем, можно было менять через PHP, а не через базу. Места в памяти они занимают одинаково, диапазон допустимых значений тоже один и тот же (до января 2038 года), легко конвертируются друг в друга (TO/FROM_UNIXTIME), но при выводе "как есть" значения таймстемпа более человекочитаемы (что немаловажно при отладке).

Автор: MystDeim 21.10.2008, 14:42
Для дней рождения я выбрал тип DATE, 
Цитата

рождения юзеров вообще лучше брать DATETIME

Время рождения важно знать только в роддоме smile

Цитата

вообще есть смысл разнести дату и время по отдельным полям (DATE и TIME соотв-но)

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

Создал таблицу в ней 2 поля TIMESTAMP и DATETIME, странно но отображаются они одинаково: CCYY-MM-DD hh:mm:ss, хотя в мануале написано, что TIMESTAMP(14) записывается как YYYYMMDDHHMMSS.

странно...

Автор: bars80080 21.10.2008, 14:50
а как выводятся?

Автор: MystDeim 21.10.2008, 15:40
Код

SELECT `ts`
FROM `user`


2008-10-21 16:39:25

Автор: bars80080 21.10.2008, 16:19
формат поля TIMESTAMP(14) попробуй задать

Автор: MystDeim 21.10.2008, 16:48
bars80080, пробовал, глюк какой-то переставить похоже надо.

Стал склоняться к использованию INT
Цитата

Храню в int, приведённый к GMT +0; 

дожно быть удобно

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

Автор: SelenIT 21.10.2008, 17:18
Цитата(MystDeim @  21.10.2008,  14:42 Найти цитируемый пост)
Время рождения важно знать только в роддоме 

Логично;). Я ступил малость.

Цитата(MystDeim @  21.10.2008,  14:42 Найти цитируемый пост)
не хочу проблем с часовыми поясами

Откуда? Сервер-то один, так какая... пардон, разница?

Цитата(MystDeim @  21.10.2008,  14:42 Найти цитируемый пост)
хотя в мануале написано,

От какой версии мануал? Если не путаю, так было по 4-ю включительно, начиная с пятой стало выводиться с разделителями. А вообще - какая разница, как оно отображается? Все равно для юзеров оно наверняка будет форматироваться как надо через DATE_FORMAT, а чтобы не перепутать сегодняшнюю запись с прошлонедельной при отладке - и по-старому, и по-новому читабельность достаточна...

Цитата(MystDeim @  21.10.2008,  16:48 Найти цитируемый пост)
при хранении в инт будет проще обрабатывать

Смотря где и как. Если в самой базе - потребуется одно дополнительное преобразование...

В целом, оно с какой-то стороны действительно надежнее - никогда не взбрыкнет, если забыть нужный параметр при апдейте установить... все в своих руках, под контролем... но и думать обо всем, начиная от банального форматирования при выводе и заканчивая вышеупомянутыми часовыми поясами, летним/зимним временем и т.п. тоже придется самому ;).

Автор: MystDeim 21.10.2008, 17:35
Спасибо всем за ответы, пришел к выводу, что нужно использовать TIMESTAMP!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)