За последние 24 часа нас посетили 17857 программистов и 1716 роботов. Сейчас ищет 931 программист ...

Как сделать аналог AUTO_INCREMENT только для даты.

Тема в разделе "MySQL", создана пользователем $oft, 16 дек 2010.

  1. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Доброго времени суток. в 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:
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    По поводу даты - храни лучше в 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'
     
  3. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Там нех..й писать)))

    Код (Text):
    1. $date = date('Y-m-d H:m:s', strtotime($date)) - для вставки в MySql
    2.  
    3. $date = date('H:m:s d.m.Y', strtotime($date)) - для вывода
     
  4. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Такс... подумал тут и решил что точность до секунд будет слишком и решил оставить только дату. И всетаки:

    Взял для теста 2010-12-10 - эту дату и подставил в код. насколько я понял из strtotime() - дата должна преобразоваться в числовую метку Unix.
    PHP:
    1. $date = date('Y-m-d', strtotime("2010-12-10"));
    2. var_dump($date);
    Но var_dump() показал что это обычная строка, т.е. что вошло, то и вышло:
    Код (Text):
    1. string(10) "2010-12-10"
    Если взять чисто strtotime() то выходит что то боле-менее похожее на метку:
    PHP:
    1. var_dump(strtotime("2010-12-10"));
    показывает результат:
    Код (Text):
    1. int(1291928400)
    В базу данных записывать $date - т.е. строковое значение? или метку?

    Если метку, то нормально ли будет мускуль делать выборку:
    [sql]SELECT blah-blahblah WHERE date BETWEEN '2010-11-08' AND '2010-12-31'[/sql] ?
     
  5. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Всё правильно - $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)
     
  6. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Ок разобрался... короче базе данных нужно передавать string дату, только мускуль понимает формат ггг-мм-дд а все остальное нужно ручками через пхп преобразовывать.

    PHP:
    1. $date = date('Y.m.d', strtotime("2010-12-10"));
    выдает то что нужно:
    Код (Text):
    1. string(10) "10.12.2010"
    sorry offtop

    PHP:
    1. mysql_query('CREATE TABLE  `short_sentences` (
    2. `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    3. `sentence` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
    4. `date` DATE NOT NULL ,
    5. ...
    6. `system` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    7. UNIQUE(`sentence` (250))
    8. )');
    Поле sentence сделал уникальным (проверка уникальности ведется в первых 250 символах).

    Раньше оно было не уникальным, поэтому сколько раз не импортировал, всё всё время дублировалось (ну это я тестирую пока, поэтому не страшно), теперь сколько раз не импортируй, всё равно остается 20 записей, те котрые в файле. Тут вроде бы всё норм - поле то уникальное.

    Но перед импортированием никаких проверок не производится.. тупо как есть в файле через while цикл загоняется в базу данных, при этом мускуль не ругается что такие данные в sentences уже есть и не будут записаны.
    Это нормально?
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    и с моей стороны оффтоп -
    хз, насколько я знаю лучше будет utf8_general_ci использовать.


    Он ругается, можешь проверить, выполнив запрос руками. Или вернув mysql_error() либо mysql_errno()

    Другой вопрос - нужно ли тебе по логике программы эту ошибку обрабатывать.
     
  8. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Да мне собственно и не нужно, главное чтобы сюрпиризов из-за этих скрытых ругачек не было.

    А так, я понимаю он либо 1 либо 0 возвращает в зависимости добавил он в базу строку из файла или ругнулся.
     
  9. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    если надо обработать ошибку - проверяй наличие mysql_error