Помогите разобраться с запрос MySql

Тема в разделе "Базы данных", создана пользователем 1Dreamweaver1, 10 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. 1Dreamweaver1

    1Dreamweaver1

    Регистр.:
    5 янв 2008
    Сообщения:
    417
    Симпатии:
    44
    Есть таблица table(id, dateTo, dateBack, Name, Fax)
    В полях dateTo, dateBack: храняться даты вида (4/25/2009).

    К примеру, необходимо вывести все "Name, Fax" с 2/5/2009 по 2/25/2009.

    Так данных не выводит, хотя в таблице данные между этими датами есть.
    Подскажите, что не так.

    PHP:
    <form action="day_res.php" method="post" id="searchfrm"
    <
    div>
    <
    input type="text" name="startday" size="8"> and <input type="text" name="dateEnd" size="8"><br><br>
    <
    input type="submit" name="submit" value="Search"></div>
    </
    form>
    $sql="SELECT * FROM table WHERE dateTo >= '".$startday."' AND dateBack <= '".$dateEnd."'";
      
    $result=mysql_query($sql);
      while(
    $row=mysql_fetch_array($result)){
    print
    "$row[Name] $row[Fax]"
     
  2. ioleg

    ioleg Создатель

    Регистр.:
    21 сен 2007
    Сообщения:
    11
    Симпатии:
    0
    Тебе нужно дату передавать в формате: yyyy-mm-dd.
    И лучше использовать BETWEEN 'дата_1' AND 'дата_2'

    И вообще с какого это перепоя у тебя в таком виде даты хранятся?
     
  3. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7
    ioleg, можно использовать любой знак пунктуации в качестве разделительного между частями разделов даты или времени, как собственно поменять и сам формат даты.

    Если колонки dateTo, dateBack не имеют тип DATE то их можно преобразовать в даты с помощью функции STR_TO_DATE(dateTo,'%d/%m/%Y').
     
  4. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Первый вопрос, какого типа поля dateTo, dateBack в твоей таблице?

    Если дата-время, тогда при запросе надо подсовывать дату в формате региональных настроек. Либо в универсальном формате, который понимается всегда yyyy-mm-dd.

    Если поля строковые, то правильнее поменять тип на дату и с ней работать.
     
  5. 1Dreamweaver1

    1Dreamweaver1

    Регистр.:
    5 янв 2008
    Сообщения:
    417
    Симпатии:
    44
    тип varchar

    Добавлено через 23 минуты
    Так то же не выводит :(
    PHP:
     $sql="SELECT * FROM table WHERE STR_TO_DATE('dateTo', '%n/%j/%Y') >= '".$startday."' AND STR_TO_DATE('dateTo', '%n/%j/%Y') <= '".$dateEnd."'";
     
  6. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7
    Может всётаки так

     
  7. 1Dreamweaver1

    1Dreamweaver1

    Регистр.:
    5 янв 2008
    Сообщения:
    417
    Симпатии:
    44
    Опечатка
    PHP:
    $sql="SELECT * FROM table WHERE STR_TO_DATE('dateTo', '%n/%j/%Y') >= '".$startday."' AND STR_TO_DATE('dateBack', '%n/%j/%Y') <= '".$dateEnd."'";
    формат в полях (dateTo, dateBack)
    mm/dd/yyyy (2/25/2009)
     
  8. hib

    hib Постоялец

    Регистр.:
    4 окт 2007
    Сообщения:
    86
    Симпатии:
    17
    Зачем дату хранить в varchar, если для нее есть свой тип.
    Бывают конечно клинические случаи, когда надо хранить строковые даты типа 38 мартобря 22300 года. Однако если дата четкая, то хранить её строками - это плохой стиль при разработке бд. Так как все эти манипуляции с конвертацией в запросах - сполошное ебалово. Все запросы с функциями типа STR_TO_DATE при смене субд накрываются медным тазом. Так что, если есть возможность без особого гимора проапдэйтить схему бд, то лучше поменять тип.
     
    1Dreamweaver1 нравится это.
  9. 1Dreamweaver1

    1Dreamweaver1

    Регистр.:
    5 янв 2008
    Сообщения:
    417
    Симпатии:
    44
    Разрабатывал не я, я доделываю.
    Возможности проапдэйтить базу нет. Там записей > 200.000
     
  10. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7
    Создай 2 дополнительных поля типа date и вставь в него даты из соответствующий полей varchar


    UPDATE table SET dateToNew = STR_TO_DATE(dateTo, '%m/%d/%Y');
    UPDATE table SET dateBackNew = STR_TO_DATE(dateBack, '%m/%d/%Y');


    Поля типа varchar с датой удилишь потом и всё.
     
    1Dreamweaver1 нравится это.
Статус темы:
Закрыта.