За последние 24 часа нас посетили 16452 программиста и 1551 робот. Сейчас ищут 2036 программистов ...

выборка за период data, time

Тема в разделе "MySQL", создана пользователем 32x.Ru, 24 июл 2008.

  1. 32x.Ru

    32x.Ru Активный пользователь

    С нами с:
    24 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    Нужно сделать выборку допустим за период между 2008-07-23 22:00:00 - 2008-07-24 01:00:00

    По понятным причинам данный запрос не пашет.
    Как составить правельный запрос
    [sql]SELECT date,time FROM `calls` where (`date` >= '2008-07-23' and time >= '22:00:00') and (`date` <= '2008-07-24' and time <= '01:00:00')[/sql]

    PS в поиске конкретного ответа пока не нашел :(
     
  2. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Блин да когда ж кончится хранение даты и времени в формате dd-m-yyyy h:i:s. Вот скажи мне, какая религия не позволяет тебе хранить все это барахло в unix_timestamp? И сравнивать было бы удобнее...
     
  3. 32x.Ru

    32x.Ru Активный пользователь

    С нами с:
    24 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    до этого я уже додумался. но теперь то поздно.
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А что в этом плохого? MySQL нормально работает с такими полями и сравнивает их корректно, а не как строки.
     
  5. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    А разве я сказал что это плохо?
    Избавляет от лишних 'and' в запросах :)
     
  6. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Надо просто хранить не отдельно, а в месте в формате DATETIME и будет всё в шоколаде.
     
  7. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    [sql]SELECT DATE_FORMAT(STR_TO_DATE(concat(`aa`,' ',`bb`),'%Y-%m-%d %H:%i:%s'),'%H %k %I %r %T %S %w') as dt FROM `ttt`[/sql]

    может такой изврат поможет ? :)

    сообственно нужно тока STR_TO_DATE(concat(`aa`,' ',`bb`),'%Y-%m-%d %H:%i:%s')
     
  8. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    32x.Ru
    переконвертируй все в нормальные таймстампы.
     
  9. 32x.Ru

    32x.Ru Активный пользователь

    С нами с:
    24 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    Наверно я что то не так понял.
    [sql]SELECT STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s') as `dt` FROM `calls` WHERE (`dt`>= '2008-07-23 22:00:00' AND `dt`<= '2008-07-24 01:00:00'[/sql]

    [sql]SELECT DATE_FORMAT(STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s'),'%H %k %I %r %T %S %w') as `dt` FROM `calls` WHERE (`dt`>= '2008-07-23 22:00:00' AND `dt`<= '2008-07-24 01:00:00'
    [/sql]
    На оба запроса ответ
    Данный формат таблицы мне был очень удобен при постаении графиков и при других запросах. Переделывать уже готовое не хочу.
    В голове радилась идея. Если получится то код выложу
     
  10. 32x.Ru

    32x.Ru Активный пользователь

    С нами с:
    24 июл 2008
    Сообщения:
    5
    Симпатии:
    0
    Вот такой вот код
    PHP:
    1.     $pattern = '|(([\d]{4})-([\d]{2})-([\d]{2})) ([\d]{2}:[\d]{2})|';
    2.     preg_match($pattern, $_POST['raport_calend1'], $matches1);
    3.     preg_match($pattern, $_POST['raport_calend2'], $matches2);
    4.  
    5.     $int1 = $matches1[2].$matches1[3].$matches1[4];
    6.     $date1 = $matches1[1];
    7.     $time1 = $matches1[5];
    8.    
    9.     $int2 = $matches2[2].$matches2[3].$matches2[4];
    10.     $date2 = $matches2[1];
    11.     $time2 = $matches2[5];
    12.     $int = $int2-$int1;
    13.    
    14.  
    15.     if($int >= 0){
    16.         $sql = "SELECT date,time FROM `calls` where `date` >= '$date1' and  `time` >= '$time1' union ";
    17.         if($int > 1){
    18.             $sql .= "SELECT date,time FROM `calls` where `date` > '$date1' and  `date` < '$date2' union ";
    19.         }
    20.         $sql .= "SELECT date,time FROM `calls` where `date` <= '$date2' and  `time` <= '$time2'  limit 50000";
    21.     }
    22.     echo $sql;
    При данных пост
    получаем запрос
    [sql]SELECT date,time FROM `calls` where `date` >= '2008-07-22' and `time` >= '13:20' union
    SELECT date,time FROM `calls` where `date` > '2008-07-22' and `date` < '2008-07-24' union
    SELECT date,time FROM `calls` where `date` <= '2008-07-24' and `time` <= '13:20'[/sql]

    При данных пост
    получаем запрос
    [sql]SELECT date,time FROM `calls` where `date` >= '2008-07-23' and `time` >= '13:20' union SELECT date,time FROM `calls` where `date` <= '2008-07-24' and `time` <= '13:20' limit 50000[/sql]

    PS парсить все равно надо было. Так как данны вводятся с календаря на JS
    PSS может кому пригодится. Пользуйтесь
     
  11. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    а объединить таблицу саму с собой не пробовал и задать ограничения в ON?
     
  12. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    "Ну вы даете, мужики" (с) какой-то фильм

     
  13. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0

    собственно так и недолжно было сработать ... колонки созданые в селекте немогут участвовать в его условии ...
    тоесть надо как-то так :[sql]SELECT STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s') as `dt` FROM `calls` WHERE (STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s')>= '2008-07-23 22:00:00' AND STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s')<= '2008-07-24 01:00:00'[/sql]

    но правильней наверное будет всетаки добавить поле и проапдейтить его благо это просто .. например
    [sql]UPDATE `calls` SET `New_coll_datetime`=STR_TO_DATE(concat(`date`,' ',`time`),'%Y-%m-%d %H:%i:%s')[/sql]