ФорумРазработкаБазы данных → Поиск по дате

Поиск по дате

  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 11 января 2009 г. 2:44

    Здравствуйте уважаемые эксперты! Столкнулся с проблемой и пока не нашел решения.
    Опишу суть проблемы: Есть база данных. Пользователь заносит свои данные, в том числе и дату рождения в формате Год-месяц-день. Есть поле для поиска по дате рождения. Необходимо сделать поиск по году. Пытался, но требует месяц и день.
    Работаю c phpmyadmin. Дата заносится в поле date. Формат уже упомянул выше. В php скрипте часть для поиска по дате прописываю так:  


    if ($_POST['date']!=""){
    $date =explode('.',$_POST['date']);
    $_POST['date']=$date[2].'-'.$date[1].'-'.$date[0];
    $sql.= " and (user.date='".$_POST['date']."')";
    }


    Все работает. Повторю вопрос, как же выдернуть только год, чтобы не требовалось месяца и дня? Понимаю что лучше с самого начала надо было бы в phpmyadmin'е отдельные поля делать. Но сейчас  база большая, уже не катит. Спасибо.

  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 11 января 2009 г. 4:24, спустя 1 час 39 минут 53 секунды

    relictx, этот раздел для тебя: http://www.mysql.ru/docs/man/Date_and_time_functions.html
    все умрут, а я изумруд
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 11 января 2009 г. 4:52, спустя 28 минут 3 секунды


    relictx, этот раздел для тебя: http://www.mysql.ru/docs/man/Date_and_time_functions.html

    Спасибо, очень интересно, почитаю.
  • kendo

    Сообщения: 446 Репутация: N Группа: Адекваты

    Spritz 11 января 2009 г. 7:16, спустя 2 часа 23 минуты 49 секунд

    Только не забываем экранировать дату функцией addslashes, если ее напрямую в БД передаем..
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 11 января 2009 г. 10:26, спустя 3 часа 9 минут 35 секунд


    Только не забываем экранировать дату функцией addslashes, если ее напрямую в БД передаем..
    какой addslashes???
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 11 января 2009 г. 10:26, спустя 40 секунд

    mesql_real_escape_string!
    Сапожник без сапог
  • relictx

    Сообщения: 307 Репутация: N Группа: Адекваты

    Spritz 12 января 2009 г. 5:52, спустя 19 часов 25 минут 21 секунду

    Разобрался с функцией YEAR.

    $sql= "Select YEAR(date) from user";

    Выводится только год. Все верно.

    Но вопрос остался открытым. Как же искать по заданному году?
    Показаны были все данные, а теперь надо, чтобы были только те, которые удовлетворяют условию заданного года. Надо составить запрос так, чтобы из таблицы date читалось не в формате год\месяц\день, а год.

    Пример как я искал по заданной дате в формате год\месяй\день:
    В Input заносим год\месяц\день, например 1980\02\01. Сохраняем в POST. Далее заносим в sql запрос:

    if ($_POST['date']!=""){
    $date =explode('.',$_POST['date']);
    $_POST['date']=$date[2].'-'.$date[1].'-'.$date[0];
    $sql.= " and (user.date='".$_POST['date']."')";
    }



    Извените, пока сам не дошел до этого, сижу вот в раздумьях) Наверно новый год еще сказывается. Спасибо)
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 5:55, спустя 3 минуты 13 секунд

    Искать так же как и извлекать
    SELECT …. WHERE YEAR(user.date) = $year
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 12 января 2009 г. 6:23, спустя 27 минут 47 секунд

    relictx
    Разносить дату в отдельные поля (месяц, год и т.д.) не стоит - при большой базе это лишняя нагрузка при выборке + путаница в целом получается. Удобнее в целостной датой работать, особенно учитывая что в мускула для работы в датами функций полно.
    Также не нужно вытаскивая данные из массива POST заносить после обработки из обратно. Лучше для этого создать временную переменную, т.е. $_POST['date']=$date[2].'-'.$date[1].'-'.$date[0]; - не очь корректно, а вот $гыук_date=$date[2].'-'.$date[1].'-'.$date[0]; - лучше

    Просто видел код, где в рамках одного скрипта два раза перезаписывались сессии (один из элементов массива сессий).
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 6:54, спустя 31 минуту 49 секунд

    дату лучше всего хранить как int11. тогда и выборки гибче, и логика проще и нагрузка меньше.
    Сапожник без сапог
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 7:04, спустя 9 минут 45 секунд


    дату лучше всего хранить как int11. тогда и выборки гибче, и логика проще и нагрузка меньше.
    да что ты?
    а как тебе мой аватар? :)
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 7:13, спустя 9 минут 9 секунд

    md5, ты не согласен в таком хранении даты? аватар - пиздат!))))))))))) я бы сам раздавил чаочао
    Сапожник без сапог
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 7:16, спустя 2 минуты 31 секунду


    md5, ты не согласен в таком хранении даты?
    я не согласен в таком хранении)
    мне удобнее использовать DATETIME
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 7:19, спустя 2 минуты 58 секунд



    md5, ты не согласен в таком хранении даты?
    я не согласен в таком хранении)
    мне удобнее использовать DATETIME
    а мне удобно делать select * from users where registertime > $time - 900;

    и не ебаться со всякими date_diff и тп
    Сапожник без сапог
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 12 января 2009 г. 7:21, спустя 1 минуту 56 секунд

    SELECT *
    FROM `users`
    WHERE NOW()-`registertime`<900


    SELECT *
    FROM `users`
    WHERE `registertime`>NOW()-900
    все умрут, а я изумруд

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