Дата и время в mysql

-faqer-

Я только учусь
Дата и время в mysql

Доброе время суток всем
Только начал изучать пхп и mysql
Возник вопрос
Делаю доску объявлений, в базу будет заноситься дата и время постинга объявления. Потом хочу производить поиск объявлений по времени.
хранить эту информацию в формате datetime не хочется какой-то карявый формат год-месяц-день часы:минуты:секунды
хранить в варчар можно в каком хочу формате, но найти потом сообщения выложенные после какой-то даты не совсем легко (для меня)
Наверное оптимально хранить в int
Какой в таких сучаях вобще используется алгоритм
как эффективно вводить дату и время в базу, а потом ее гибко от туда выводиь на страницы в желаемом формате
 

si

Administrator
год-месяц-день часы:минуты:секунды
Нормальный формат. Храниться они как int а для форматирования есть date_format()


хранить в варчар можно в каком хочу формате
А вот это как раз коряво и не правильно.

Почитайте что нибуть про DB, знаний у вас явно 0.
 

-faqer-

Я только учусь
Почитайте что нибуть про DB, знаний у вас явно 0.
Ну так я насчет знаний и не спорю особенно. Хотя их может не ноль а где-то 0,1 по стобальной
Ну а насчет почитать, то я сам догадался, но тока что именно почитать????

А если при постинге сделать так

PHP:
$datetime = time();
//потом $datetime заносим в базу в поле с фарматом int
//т.е. уже можно искать и меньшее значение и большее и
//в промежутке так тамбудут храниться загадочные цифры
//1027518273 для 24.07.2002 15:44:33, это что в секунды
//переведено) А потом для вывода на страницу
echo date ("$sep d.m.Y $sep H:i:s",$b);
А как тогда при передаче запроса на поиск по времени провести весь процес в обратную сторону. Т.е. для запроса к базе из 24.07.2002 15:44:33 получить 1027518273
 

Demiurg

Guest
Я не понимаю, зачем извращаться ? Это все равно, что лошадь хранить в гараже, когда есть рядом нормальное стойбище. Тип DateTime специально сделан, что бы в нем хранили время. И при выводе всегда можно приобразовать.
 

benadin

Guest
2 Demiurg
просто из формата "seconds since the epoch" очень легко делать вывод с помощью strftime() или того же date()

Минус - ограниченный диапазон дат.
 

benadin

Guest
Согласен, datetime с UNIX_TIMESTAMP() рулит!
Т.е. он супер подходит для всех случаев, разве что если где-то достаточно только время, например.... тогда, с целью экономии места на диске..... :)
 

Rat

Guest
А если в базе создать поле

[mySQL]
...
date timestamp not null,
...
[mySQL]

и при инсерте передавать null,
то не надо заморачиваться с занесением текущего
datetime.
 

-faqer-

Я только учусь
Мне тут все дружно рассказывали что время можно хранить как угодно, а потом его можно отформатировать как угодно
К несчастью (во всяком случае как понял я) отформатировать как угодно время можно в том случае если оно в timestamp
тогда да можно в хвост и в гриву
Но вот ни date() не strftime() не переводят дату в нужный мне формат из формата год-месяц-день (в которм хранит дату мускул)
А указанная выше вункция date_format() ваще, похоже, не существует
Или это предложение склепать ее самому на основе регулярных выражений

И еще вопрос, я его задавал ранее
как из человеческого формата день.месяц.год час:минута:секунда
перевести время в бесчеловечный timestamp
 

Апельсин

Оранжевое создание
К несчастью (во всяком случае как понял я) отформатировать как угодно время можно в том случае если оно в timestamp
тогда да можно в хвост и в гриву
Отформатировать можно не только timestamp, а любой тип для дат (datetime,date,time...)

А указанная выше вункция date_format() ваще, похоже, не существует
Или это предложение склепать ее самому на основе регулярных выражений
а поискать в мануале?
http://www.mysql.com/doc/D/a/Date_and_time_functions.html
 

-faqer-

Я только учусь
Ай'м сори
Я по своей природной тупости принял date_format() за пэхеповскую функцию, которой действительно нет

Понимаю что подобные вопросы надо задавть в разделе PHP & Новички
Но уже коли начал тут так уже разобраться бы
Допустим есть у меня в скрипте такое вот дело
PHP:
$r=mysql_query("SELECT `id`,`date`,`time`,`city`,`author`,`header`,`message` FROM table");
for($i=0; $i<mysql_num_rows($r); $i++)
{
$view=mysql_fetch_array($r);
echo "$view[id]<br>$view[date]<br>$view[time]<br>$view[city]<br>$view[author]<br>$view[header]<br>$view[message]<hr>';

}
этот самый date хранится в таблице как год-месяц-день
как мне в mysql_query втулить date_format() с параметрами %d.%m.%Y'
что бы $view['date'] была уже в формате день.месяц.год
 

lenni

Guest
а так и надо
SELECT DATE_FORMAT(date, '%d.%m.%Y') ...

смотри мануал, там все неплохо расписано
 

RomikChef

Guest
Факер.
Все просто.
Если хранишь в формате datetime, то юзаешь в запросе date_format()
если хранишь в int, то юзаешь from_unixtime()
Я раньше делал перове, сейчас - второе.

Деми, я понимаю, что лошадь, но мне как-то больше нравится... Простой инт, никаких внутренних преобразований...

Факер
$r=mysql_query("SELECT `id`,`date`,`time`,`city`,`author`,`header`,`message` FROM table");

выведет тебе слова id`,`date`,`time`- вместо значений полей.
Имена полей надо писать без кавычек. В кавычках - ТОЛЬКО передавыаемые данные. Ну, или если ты в селекте хочешь получить не поле, а именно слово.

$r=mysql_query("SELECT *,date_format(time, '%d.%m.%Y') as rus_date FROM table");

и обращаться надо $view['rus_date']
это делается потому, что если ты напишешь select ... order by date, то отсортировано будет по отформатированной дате и получится бардак.
 

RomikChef

Guest
date() тебе прекрасно переведет из числа секунд.
Главное, что ты должен усвоить из РНР и муськи, это что надо скачать себе хелпы по ним в формате .chm и за полсекунды смотреть там параметры функций.

и на закуску. Есть такая замечательная функция extract()

вместо
$view=mysql_fetch_array($r);
пишешь
extract(mysql_fetch_array($r));
и!
echo "$id<br>$date<br>$time<br>$city<br>$author<br>$header<br>$message<hr>';

гораздо удобнее!
 

benadin

Guest
Originally posted by RomikChef
если хранишь в int, то юзаешь from_unixtime()
Я раньше делал перове, сейчас - второе.
Деми, я понимаю, что лошадь, но мне как-то больше нравится... Простой инт, никаких внутренних преобразований...
Хранишь в int - даты только с "начала эпохи"... А datetime - универсально - фактически неограниченный диапазон дат ('9999-12-31 23:59:59'). А хочешь "в int-е"? - см. пост tony2001 Здесь максимум выберешь неверное значение, дата же в базе будет соответствовать действительности!!!
Храним даты в datetime ;)
 

RomikChef

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

RomikChef

Guest
из человеческого формата день.месяц.год час:минута:секунда
в бесчеловечный timestamp перевести невозможно.
Это возможно из буржуйского формата
m/d/y h:i:s
в РНР это делает функция strftime()

в муське - UNIX_TIMESTAMP(), только входной формат у нее немножко другой - формат datetime

Но вообще такое преобразование требуется крайне редко, и чаще всего без него можно обойтись.
 

-faqer-

Я только учусь
2 RomikChef
Сапасибо, то что доктор прописал

А начсет $r=mysql_query("SELECT `id`,`date`,`time`,`city`,`author`,`header`,`message` FROM table");
Так оно у меня, как это ни странно, выводило не название полей а их содержание

Ну и насчет требуется крайне редко
Допустим пишется администраторский скрипт, при помощи которого хотелось бы вывести все соощения пропостенные в какой-то промежуток времени
промежуток задается из формы
Допустим дата и время хранятся в таблице в инте
Вот как раз в этой ситуации и захочется перевести из человекоподобного формата в timestamp
 

RomikChef

Guest
А, ну так я перепутал с другой кавычкой.
Но и такие - `- собственно, не нужны.
Имена полей вообще безо всяких кавычек пишутся.

А насчет формата
день.месяц.год час:минута:секунда
Ты же сам устанавливаешь, в каком формате к тебе данные в скрипт приходят.
Я, например, <select>-ами выбираю отдельно день, месяц и год. а потом mktime()-ом делаю timestamp

Ну, а если хочется вводить именно в формате
день.месяц.год час:минута:секунда
то субстрингами или регуляркой разбиваешь на переменные и тот же самый mktime()

Встроенных функций для работы с русской датой ни в РНР, ни в муське нет.
 
Сверху