Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > выборка за период data, time


Автор: PHPcoding 24.7.2008, 14:27
Нужно сделать выборку допустим за период между 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')




PS в поиске конкретного ответа пока не нашел 

Автор: skyboy 24.7.2008, 14:45
1. имена всех полей и таблиц в запросе заключаем в обратные апострофы.
2. для вычлениения временной части и даты из поля типа дата/время(datetime) используем функции http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date и http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_time
я надеюсь, у тебя не в строковом типе поля хранится дата и время?

Автор: PHPcoding 24.7.2008, 15:09
Таблица такая. (На самом деле там есть еще несколько полей но они к условию where не относятся)
Код

CREATE TABLE `calls` (
  `id` bigint(20) NOT NULL auto_increment,
  `date` date default '2000-01-01',
  `time` time default '00:00:00',
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251; 
[B]

задача:[/B]
Нужно сделать выборку допустим за период между 2008-07-23 22:00:00 - 2008-07-24 01:00:00 *

Автор: skyboy 24.7.2008, 15:26
Код

WHERE (`date`= '2008-07-23' AND `time` > '22:00:00') OR (`date`=  '2008-07-24'  AND `time` < '01:00:00')

Автор: PHPcoding 24.7.2008, 18:45
Цитата

Код

WHERE (`date`= '2008-07-23' AND `time` > '22:00:00') OR (`date`=  '2008-07-24'  AND `time` < '01:00:00')



да данный код справляется с данной задачей. 
Но у меня интервал может быть апсолютно любым. 
Программа должна работать с интервалами от нескольких минут до нескольких лет

Автор: skyboy 24.7.2008, 19:12
PHPcoding, фокус-покус.
фокус в том, что если бы ты хранил дату и время в виде одного поля datetime, тебе не понадобились бы танцы с бубном.
положим, у нас необходимость посмотреть в диапазоне от даты d0 и времени t0 до даты d1 и времени t1
Код

WHERE (`date` > d1 AND `date` < d1) OR (`date` = d1 AND `time`> t1) OR (`date` = d2 AND `time`> t2)

как ни странно, но сие будет работать для "абсолютно любого интервала", при условии, что d2t2 > d1t1

Добавлено через 1 минуту и 4 секунды
можно слепить дату и время в datetime хотя бы при помощи str_to_date, но по-моему, это будет немного запутанно

Автор: PHPcoding 24.7.2008, 20:06
Код

Вот такой вот код
  $pattern = '|(([\d]{4})-([\d]{2})-([\d]{2})) ([\d]{2}:[\d]{2})|'; 
    preg_match($pattern, $_POST['raport_calend1'], $matches1); 
    preg_match($pattern, $_POST['raport_calend2'], $matches2); 

    $int1 = $matches1[2].$matches1[3].$matches1[4];
    $date1 = $matches1[1];
    $time1 = $matches1[5];
    
    $int2 = $matches2[2].$matches2[3].$matches2[4];
    $date2 = $matches2[1];
    $time2 = $matches2[5];
    $int = $int2-$int1;
    

    if($int >= 0){
        $sql = "SELECT date,time FROM `calls` where `date` >= '$date1' and  `time` >= '$time1' union ";
        if($int > 1){
            $sql .= "SELECT date,time FROM `calls` where `date` > '$date1' and  `date` < '$date2' union ";
        }
        $sql .= "SELECT date,time FROM `calls` where `date` <= '$date2' and  `time` <= '$time2'  limit 50000";
    }
    echo $sql;


При данных пост
Цитата
Array
(
    [raport_calend1] => 2008-07-22 13:20
    [raport_calend2] => 2008-07-24 13:20
)

получаем запрос
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' 


При данных пост
Цитата
Array
(
    [raport_calend1] => 2008-07-23 13:20
    [raport_calend2] => 2008-07-24 13:20
)

получаем запрос
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 


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

Автор: Feldmarschall 24.7.2008, 20:34
жесть.
а юнион-то тут зачем?

Автор: PHPcoding 24.7.2008, 20:50
Цитата

жесть.
а юнион-то тут зачем?

А ты можеш предложить вариант лутше???

Автор: Feldmarschall 24.7.2008, 20:57
а какая проблема все условия вставить в один и тот же запрос-то?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)