За последние 24 часа нас посетили 17778 программистов и 1650 роботов. Сейчас ищут 1264 программиста ...

Помогите не сломать мозги с запросом с выборкой даты

Тема в разделе "MySQL", создана пользователем kit, 22 янв 2008.

  1. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Всем привет! Есть таблица gruztr в ней столбцы data_in и sut_from. В data_in записана дата начала события, в sut_from количество дней в течении которых событие актуально начиная с даты начала события. Необходимо сделать запрос в котором будут выбираться значения начиная с определенной даты + несколько суток (по умолчанию стоит текущая дата).
    Отрывок страницы поиска:
    PHP:
    1.  
    2. echo"<select  name=day_from size=\"1\">"; //Формирую число поиска
    3. for ($i=1; $i<32; $i++)
    4. {
    5.     if (date('d')==$i) $selected="selected"; else $selected="";
    6.     echo "<option $selected>".$i."</option>";
    7. }
    8. echo"</select>";
    9. echo"<select  name=month_from size=\"1\">";//Формирую месяц поиска
    10. $mass=array('января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
    11. for ($i=1; $i<13; $i++)
    12. {
    13.     if (date('m')==$i) $selected="selected"; else $selected="";
    14.     echo "<option $selected>".$mass[($i-1)]."</option>";
    15. }
    16. echo"</select>";
    17. echo"<select  name=year_from size=\"1\">";//Формирую год поиска
    18. for ($i=date('Y'); $i<(date('Y')+2); $i++)
    19. {
    20.     if (date('Y')==$i) $selected="selected"; else $selected="";
    21.     echo "<option $selected>".$i."</option>";
    22. }
    23. echo"</select>";
    24. echo"<select  name=sut_from size=\"1\">";//плюс сколько суток от выбранной даты (7 значений на выбор)
    25. $selected="";
    26. $mass=array(1,2,3,5,7,14,30);
    27. for ($i=0; $i<7; $i++)
    28. {
    29.     if ($i==2) $selected="selected"; else $selected="";
    30.     echo "<option $selected>".$mass[$i]."</option>";
    31. }
    32. echo"</select>";
    33.  
    Страница куда отправляет форма:
    PHP:
    1.  
    2. $mass=array('января'=>'01','февраля'=>'02','марта'=>'03','апреля'=>'04','мая'=>'05','июня'=>'06','июля'=>'07','августа'=>'08','сентября'=>'09','октября'=>'10','ноября'=>'11','декабря'=>'12');
    3. echo "<pre>";
    4. $month=$mass[$_POST['month_from']];
    5. echo "</pre>";
    6. $data_in=$_POST['year_from']."-".$month."-".$_POST['day_from']; //привожу дату начала поиска в буржуйский вид YYYY-mm-dd
    7. $data_from=date("Y-m-d",strtotime($data_in) + $_POST['sut_from']*86400);//определяю дату конца поиска
    8. $data="$data_in>=data_in AND $data_from<=DATE_ADD(data_in, INTERVAL sut_from day)"; //формирую часть запроса
    9. $query_1="SELECT * FROM gruztr WHERE $data ORDER BY id_gruztr DESC";//сам запрос
    10.  
    Вся проблема в 7-й строке обработчика формы. Ввожу сегодняшнюю дату (22 января 2008г)+3 дня. В базе точно есть запись, удовлетворяющая условию поиска (22.01.08-25.01.08), но она не находится. В чем ошибка? Кто может подскажите, уже мозгов не хватает!
     
  2. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    неудивительно.
    http://phpfaq.ru/debug1

     
  3. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Что я и сделал:
    [sql]SELECT * FROM gruztr WHERE 2008-01-22>=data_in AND 2008-01-25<=DATE_ADD(data_in, INTERVAL sut_from day) ORDER BY id_gruztr DESC[/sql] Это результат, что тут не правильно?
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что неправильно - ты должен посмотреть сам, какую ошибку скажет мускул.
    И пока запрос не будет давать правильный результат - лезть в ту мешанину что ты нагородил выше смысла нет никакого.
     
  5. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    КА-ВЫЧ-КИ! Вот какой я ожидал ответ, но сам его нашел. Все равно спасибо, приятно знать что тебе рады помочь
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Ура, хоть кто-то попытался сделать сам. Если еще запомнишь путь, по которому находятся ответы - будет вообще зашибись.
     
  7. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Запрос с выборкой даты: мучения продолжаются

    Запрос с выборкой даты: мучения продолжаются!!! ХЭЛП!!!
    Даже изобразил схему:
    [​IMG]
    21...27 - это числа месяца. Событие актуально с 22 по 25-е число и записано в БД. Я нарисовал 3 варианта поиска, которые должны найти это событие в БД. 1 вариант (красный), когда нижняя граница поиска (a) попадает в диапазон события, а верхняя (b) нет. 2 вариант (синий), наоборот, (a) не попадает в диапазон поиска, а (b) попадает. 3 вариант (зеленый), когда обе границы попадают в диапазон поиска. Для точности надо сказать, что есть и 4-й вариант, когда нижняя граница поиска ниже нижней границы записи, а верхняя выше выше верхней (на рисунке не изображено). Пожалуйста помогите написать логику запроса, в котором запись находится, если поиск хотябы частично ее цепляет (т.е. любой из 4-х вариантов). В своих вариантах запросов я запутался, нужна свежая мысль.
     
  8. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    where date_seek_end>=date_unit_start and date_seek_start<=date_unit_end
     
  9. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    я тоже так сначала думал, но не находит таким образом все результаты, только некоторые
     
  10. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    1) ошибка в запросе
    2) ошибка в данных. чаще всего дата нулевая.
     
  11. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Я вот как попробовал:
    PHP:
    1. $data="AND ('$data_in'<=data_in AND DATE_ADD(data_in, INTERVAL sut_from day)>='$data_from' AND '$data_from'>=data_in)";
    2.  
    3. $data=$data."OR (data_in<='$data_in' AND DATE_ADD(data_in, INTERVAL sut_from day)>='$data_from')";
    4.  
    5. $data=$data."OR ('$data_in'>=data_in AND '$data_from'>=DATE_ADD(data_in, INTERVAL sut_from day) AND '$data_in'<=DATE_ADD(data_in, INTERVAL sut_from day))";
    6.  
    7. $data=$data."OR (data_in>='$data_in' AND '$data_from'>=DATE_ADD(data_in, INTERVAL sut_from day))";
    8.  
    9. $query_1="SELECT * FROM gruztr WHERE $data ORDER BY id_gruztr DESC";
    Т.е. все 4 варианта, иначе никак. Пока вроде работает, но надо еще погонять. Блин, опять все сам сделал. Вроде не пишу в форум, думаю что сам справлюсь, потом ступор, жалобное послание к гуру, а уж потом озарение.