Доброго времени суток. в MySQL не особо сильно шарю. Создаю скрипт импортирования некоторой информации из текстового файла в базу данных. Каждая строка информации содержит всебе несколько данных, типа массив (текст, автор, источник, дата добавления и т.д..). Меня собственно интересует дата. Условие 1: Когда создается запись в базе данных НЕ ЧЕРЕЗ ИМПОРТ этого файла, она должна создаваться автоматически в формате: HH:MM:SS DD.MM.YYYY Есть ли что-то вроде AUTO_INCREMENT только для даты? Условие 2: Если запись в БД создается по средствам импорта строки из текстового файла, то автоматический ввод не должен вводить, а в эту ячейку предназначенную для даты записывается то что написано в текстовом файле. Соответственно в текстовом файле будет такой же формат: HH:MM:SS DD.MM.YYYY, но это будет как бы в виде строкового значения передаваться. Это принципиально для MySQL или же нежно искать способ передачи именно типа данных "дата", если таковой вообще есть? Условие 3: Должна при всём этом работать выборка по датам: скажем с 01.01.2010 по 01.05.2010 или с указанием более точной выборки: с 22:32:13 01.01.2010 по 01:01:59 01.05.2010, сортировка вне зависимости от того, откуда была занесена запись: автоматически или из файла через INSERT... Заранее спасибо. Надеюсь в MySQL предусмотрено такое ибо если писать обработчик дат через PHP то это вообще через Ж выходит, но выходит :lol:
По поводу даты - храни лучше в yyyy-mm-dd hh:mm:ss - это формат DATETIME, тогда сможешь спокойно воспользоваться функциями для работы с датой. А к виду HH:MM:SS DD.MM.YYYY - будешь приводить при выводе. Функция NOW() подойдет? Это и есть DATETIME, причем передавать нужно именно в его формате - yyyy-mm-dd либо hh:mm:ss. Да. SELECT blah-blahblah WHERE date BETWEEN '2010-11-08 02:09:13' AND '2010-12-31 23:59:59'
Там нех..й писать))) Код (Text): $date = date('Y-m-d H:m:s', strtotime($date)) - для вставки в MySql $date = date('H:m:s d.m.Y', strtotime($date)) - для вывода
Такс... подумал тут и решил что точность до секунд будет слишком и решил оставить только дату. И всетаки: Взял для теста 2010-12-10 - эту дату и подставил в код. насколько я понял из strtotime() - дата должна преобразоваться в числовую метку Unix. PHP: $date = date('Y-m-d', strtotime("2010-12-10")); var_dump($date); Но var_dump() показал что это обычная строка, т.е. что вошло, то и вышло: Код (Text): string(10) "2010-12-10" Если взять чисто strtotime() то выходит что то боле-менее похожее на метку: PHP: var_dump(strtotime("2010-12-10")); показывает результат: Код (Text): int(1291928400) В базу данных записывать $date - т.е. строковое значение? или метку? Если метку, то нормально ли будет мускуль делать выборку: [sql]SELECT blah-blahblah WHERE date BETWEEN '2010-11-08' AND '2010-12-31'[/sql] ?
Всё правильно - $date = date('Y-m-d', strtotime("2010-12-10")); будет возвращать строку в формате DATETIME Просто ты писал про строки типа 10.12.2010 - если ты её запишешь в поле типа DATETIME запрос будет некорректным. Хранить метку - это вариант, тогда и запросы соответственно будут [sql] SELECT blah-blahblah WHERE date BETWEEN 1291928400 AND 1293698547[/sql] А тип поля будет TIMESTAMP Тут на твой выбор - как удобнее. Еще раз - либо поле типа TIMESTAMP - тогда с помощью strtotime строки приводим к timestamp, либо поле типа DATETIME (либо DATE - это без секунд) , тогда все числа приводим к виду yyyy-mm-dd Я в примерах выше приводил к DATETIME - привык хранить в этом типе. Мне с ним понятнее операции делать - типа DATE_ADD(date, +1 MONTH), DATE_ADD(date, -1 DAY)
Ок разобрался... короче базе данных нужно передавать string дату, только мускуль понимает формат ггг-мм-дд а все остальное нужно ручками через пхп преобразовывать. PHP: $date = date('Y.m.d', strtotime("2010-12-10")); выдает то что нужно: Код (Text): string(10) "10.12.2010" sorry offtop PHP: mysql_query('CREATE TABLE `short_sentences` ( `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `sentence` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `date` DATE NOT NULL , ... `system` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, UNIQUE(`sentence` (250)) )'); Поле sentence сделал уникальным (проверка уникальности ведется в первых 250 символах). Раньше оно было не уникальным, поэтому сколько раз не импортировал, всё всё время дублировалось (ну это я тестирую пока, поэтому не страшно), теперь сколько раз не импортируй, всё равно остается 20 записей, те котрые в файле. Тут вроде бы всё норм - поле то уникальное. Но перед импортированием никаких проверок не производится.. тупо как есть в файле через while цикл загоняется в базу данных, при этом мускуль не ругается что такие данные в sentences уже есть и не будут записаны. Это нормально?
и с моей стороны оффтоп - хз, насколько я знаю лучше будет utf8_general_ci использовать. Он ругается, можешь проверить, выполнив запрос руками. Или вернув mysql_error() либо mysql_errno() Другой вопрос - нужно ли тебе по логике программы эту ошибку обрабатывать.
Да мне собственно и не нужно, главное чтобы сюрпиризов из-за этих скрытых ругачек не было. А так, я понимаю он либо 1 либо 0 возвращает в зависимости добавил он в базу строку из файла или ругнулся.