SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.05.2012 16:02:39

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

как выбрать информацию которая не входит в диапазон дат?

например есть диапазон дат: 2012-04-03 12:03:00(firstDate) - 2012-04-07 07:50:00(secondDate) = (п1).
пользователь вводит нужный ему диапазон дат: 2012-04-15 15:05:00 - 2012-04-27 17:00:00 = (п2).
как выбрать всю информацию которая находится в диапазоне п2, но не входит в диапазон п1?
я так понимаю для таких целей лучше использовать оператор between?

Неактивен

 

#2 06.05.2012 19:24:08

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: как выбрать информацию которая не входит в диапазон дат?

как выбрать всю информацию которая находится в диапазоне п2, но не входит в диапазон п1?

date NOT BETWEEN (п1) AND date BETWEEN (п2)

Вместо BETWEEN можно использовать и другие условия.

Неактивен

 

#3 06.05.2012 19:30:33

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

LazY написал:

как выбрать всю информацию которая находится в диапазоне п2, но не входит в диапазон п1?

date NOT BETWEEN (п1) AND date BETWEEN (п2)

Вместо BETWEEN можно использовать и другие условия.

но дело в том, что у меня два поля date & date2 как с учетом этих полей сделать запрос? У меня просто первый диапазон хранится в БД и он не в одной ячейке, а в двух

Отредактированно alexiy (06.05.2012 19:51:12)

Неактивен

 

#4 07.05.2012 04:24:32

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: как выбрать информацию которая не входит в диапазон дат?

Как условие звучит точно? (с участием имён колонок)

Неактивен

 

#5 07.05.2012 11:19:46

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

вот практический пример : допустим машина сдается на период с 2012-05-04 15:09(firstDate) до 2012-05-10 17:45(secondDate).
но с 2012-05-13 15:09 и 2012-05-16 17:45(эти даты ввел пользователь) она свободна и если пользователь ввел дату которая не входит в диапазон(2012-05-04 15:09 до 2012-05-10 17:45) она должна быть отображена

Неактивен

 

#6 07.05.2012 14:30:05

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: как выбрать информацию которая не входит в диапазон дат?

Тогда логика такая.
Чтобы диапазоны дат не пересекались, ни начальная, ни конечная дата периода, на который машина сдана, не должна попасть в интервал, который ввел пользователь:

firstDate NOT BETWEEN [то, что ввёл пользователь]
AND
secondDate NOT BETWEEN [то, что ввёл пользователь]

Некоторый недостаток такого запроса состоит в том, что с NOT не используются индексы, поэтому запрос можно переписать через < > - тогда есть шанс, что по одной из колонок индекс будет использоваться.
Если $max - бОльшая дата, которую ввел пользователь, $min - меньшая, то запрос примет вид:

(firstDate > $max AND secondDate > $max)
OR
(firstDate < $max AND secondDate < $max)

Неактивен

 

#7 07.05.2012 14:58:10

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

я пробовал такой вариант, но не получалось что-то у меня. хочу уточнить поле в БД имеет тип datetime а сравниваю я со строчной переменной. работаю с php и там получаю строку $firstDate = $date." ".$time; может в этом вся причина?

Неактивен

 

#8 07.05.2012 15:03:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Ну это смотря как выглядят $date и $time. Переменная $firstDate должна иметь вид 2012-01-31 18:44:22


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 07.05.2012 16:02:08

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

странно, она имеет такой вид

Неактивен

 

#10 07.05.2012 16:03:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Покажите сам запрос. Полностью, со всеми подставленными php-шными переменными.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 07.05.2012 16:18:18

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?


$firstDate = $d1." ".$h1.":".$m1;
$secondDate = $d2." ".$h2.":".$m2;
 


$sql = "SELECT cardata, country, class, transmission FROM cars LEFT JOIN (SELECT car FROM zakaz WHERE fdate NOT BETWEEN '$firstDate' AND '$secondDate' AND sdate NOT BETWEEN '$firstDate' AND '$secondDate' ) t ON cars.cardata = t.car WHERE t.car IS NULL";
 

Неактивен

 

#12 07.05.2012 16:28:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: как выбрать информацию которая не входит в диапазон дат?

Осталось подставить переменные и вывести результат. echo ($sql), например.

Неактивен

 

#13 07.05.2012 16:31:18

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

так переменный подставлены, а как результат ничего не выводит

Неактивен

 

#14 07.05.2012 16:33:43

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Вместо

$sql = "SELECT cardata, country, class, transmission FROM cars LEFT JOIN (SELECT car FROM zakaz WHERE fdate NOT BETWEEN '$firstDate' AND '$secondDate' AND sdate NOT BETWEEN '$firstDate' AND '$secondDate' ) t ON cars.cardata = t.car WHERE t.car IS NULL";


напишите

$sql = "SELECT cardata, country, class, transmission FROM cars LEFT JOIN (SELECT car FROM zakaz WHERE fdate NOT BETWEEN '$firstDate' AND '$secondDate' AND sdate NOT BETWEEN '$firstDate' AND '$secondDate' ) t ON cars.cardata = t.car WHERE t.car IS NULL";

print $sql;


И то, что выведет этот print $sql пришлите сюда. А если еще и дамп табличек cars и zakaz приложите, то совсем хорошо будет.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#15 07.05.2012 16:39:43

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

SELECT cardata, country, class, transmission FROM cars LEFT JOIN (SELECT car FROM zakaz WHERE fdate NOT BETWEEN '2012-05-01 00:00' AND '2012-05-05 00:00' AND sdate NOT BETWEEN '2012-05-01 00:00' AND '2012-05-05 00:00' ) t ON cars.cardata = t.car WHERE t.car IS NULL
вот что он вывел
cкрин на структуры таблицы zakaz
http://s019.radikal.ru/i644/1205/95/53ecc0f41387.jpg

Неактивен

 

#16 07.05.2012 16:45:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Не уверен, что проблема именно в этом, но секунд не хватает вместо '2012-05-01 00:00' стоит писать '2012-05-01 00:00:00'. Плюс скобки расставьте в условии WHERE.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 07.05.2012 16:48:48

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

а в чем тогда может быть проблема?

Неактивен

 

#18 07.05.2012 16:51:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Давайте сперва убедимся, что проблема не в отсутствующих секундах и не отсутствии скоробок в WHERE - там будем дальше смотреть. Плюс приведите все же дамп таблиц cars и zakaz в форме http://sqlinfo.ru/forum/viewtopic.php?pid=27835#p27835


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 07.05.2012 21:30:18

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

deadka написал:

Давайте сперва убедимся, что проблема не в отсутствующих секундах и не отсутствии скоробок в WHERE - там будем дальше смотреть. Плюс приведите все же дамп таблиц cars и zakaz в форме http://sqlinfo.ru/forum/viewtopic.php?pid=27835#p27835

перепроверли все и получается, что ступор происходит с LEFT JOIN в нем смысл такой, чтобы он отобрал из zakaz занятые машины на определенный период и отбросил бы их из таблицы cars

Неактивен

 

#20 07.05.2012 22:13:48

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Не совсем понятно, проблема решилась?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#21 07.05.2012 22:19:03

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

deadka написал:

Не совсем понятно, проблема решилась?

нет, причина в LEFT JOIN что-то он не срабатывает как надо

Неактивен

 

#22 07.05.2012 22:20:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Это крайне сомнительно, скорее запрос составлен некорректно. Приведите уже дампы таблиц и тот результат, который Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#23 08.05.2012 01:27:01

alexiy
Участник
Зарегистрирован: 19.02.2012
Сообщений: 21

Re: как выбрать информацию которая не входит в диапазон дат?

deadka написал:

Это крайне сомнительно, скорее запрос составлен некорректно. Приведите уже дампы таблиц и тот результат, который Вы хотите получить.

вот дамп таблицы zakaz


CREATE TABLE IF NOT EXISTS `zakaz` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fdate` datetime NOT NULL,
  `fhotel` varchar(50) NOT NULL,
  `clientname` varchar(50) NOT NULL,
  `room` int(4) NOT NULL,
  `sdate` datetime NOT NULL,
  `shotel` varchar(50) NOT NULL,
  `sadmin` varchar(50) NOT NULL,
  `daycount` int(3) NOT NULL,
  `retcountry` varchar(50) NOT NULL,
  `car` varchar(50) NOT NULL,
  `carpriceday` float NOT NULL,
  `discount` float NOT NULL,
  `totalperday` float NOT NULL,
  `dinsur` int(11) NOT NULL,
  `insurance` int(3) NOT NULL,
  `addriver` int(11) NOT NULL,
  `childseat` int(11) NOT NULL,
  `autotrans` int(11) NOT NULL,
  `gps` int(11) NOT NULL,
  `skibox` int(11) NOT NULL,
  `another` int(11) NOT NULL,
  `anothertext` text NOT NULL,
  `outoworktime` float NOT NULL,
  `anothertwotext` varchar(50) NOT NULL,
  `anothertwo` float NOT NULL,
  `borderpermission` float NOT NULL,
  `abothercountry` int(11) NOT NULL,
  `returplace` float NOT NULL,
  `mapfine` float NOT NULL,
  `smokepenalty` float NOT NULL,
  `anotherplacereturn` float NOT NULL,
  `parkfine` float NOT NULL,
  `speedpen` float NOT NULL,
  `overborderpenalty` float NOT NULL,
  `carwash` float NOT NULL,
  `fullwash` float NOT NULL,
  `tankfee` float NOT NULL,
  `fullfuel` float NOT NULL,
  `cashtype` varchar(11) NOT NULL,
  `cardtype` varchar(10) NOT NULL,
  `depozittype` varchar(10) NOT NULL,
  `ordersumm` float NOT NULL,
  `returnsumm` float NOT NULL,
  `totalsumm` float NOT NULL,
  `comment` text NOT NULL,
  `cashsumm` float NOT NULL,
  `cardsumm` float NOT NULL,
  `depozit` float NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=212 ;

--
-- Dumping data for table `zakaz`
--

INSERT INTO `zakaz` (`id`, `fdate`, `fhotel`, `clientname`, `room`, `sdate`, `shotel`, `sadmin`, `daycount`, `retcountry`, `car`, `carpriceday`, `discount`, `totalperday`, `dinsur`, `insurance`, `addriver`, `childseat`, `autotrans`, `gps`, `skibox`, `another`, `anothertext`, `outoworktime`, `anothertwotext`, `anothertwo`, `borderpermission`, `abothercountry`, `returplace`, `mapfine`, `smokepenalty`, `anotherplacereturn`, `parkfine`, `speedpen`, `overborderpenalty`, `carwash`, `fullwash`, `tankfee`, `fullfuel`, `cashtype`, `cardtype`, `depozittype`, `ordersumm`, `returnsumm`, `totalsumm`, `comment`, `cashsumm`, `cardsumm`, `depozit`) VALUES
(211, '2012-05-07 09:30:00', 'test', 'asd', 23, '2012-05-08 13:30:00', 'test', 'asd', 366, 'Latvia', 'Toyouta', 12, 3, 4260.24, 0, 0, 3660, 3660, 0, 3660, 0, 3660, 'Another', 10, 'Another', 0, 10, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'cash', 'CreditCard', '', 18930.2, 0, 0, '', 0, 0, 0);
 


вот таблица cars

CREATE TABLE IF NOT EXISTS `cars` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cardata` varchar(100) NOT NULL,
  `country` varchar(15) NOT NULL,
  `class` varchar(3) NOT NULL,
  `transmission` varchar(2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=48 ;

--
-- Dumping data for table `cars`
--

INSERT INTO `cars` (`id`, `cardata`, `country`, `class`, `transmission`) VALUES
(42, 'BMW', 'Estonia', 'C', 'at'),
(43, 'Audi', 'Lithuania', 'C', 'at'),
(44, 'Bently', 'Latvia', 'B', 'at'),
(45, 'Toyouta', 'Latvia', 'B', 'mt'),
(41, 'VOLVO as3456', 'Lithuania', 'c', 'AT'),
(46, 'Saav', 'Latvia', 'C', 'at'),
(47, 'novaja', 'Estonia', 'A', 'at');
 


нужно сделать так: если например пользователь введет 2012-05-07 06:00 - 2012-05-08 08:00 запрос бы вернул следующие машины:
BMW
Audi
Bently
VOLVO as3456
Saav
novaja

а если пользователь введет  2012-05-10 13:00 - 2012-05-12 08:00, то запрос должен вернуть
BMW
Audi
Bently
VOLVO as3456
Saav
novaja
toyota

Неактивен

 

#24 11.05.2012 16:50:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: как выбрать информацию которая не входит в диапазон дат?

Да, была ошибка, нужно так:

SELECT
    cardata, country, class, transmission FROM cars
LEFT JOIN
   (SELECT car FROM zakaz WHERE fdate NOT BETWEEN '2012-05-07 06:00:00' AND
    '2012-05-08  08:00:00' OR sdate NOT BETWEEN '2012-05-07 06:00:00' AND '2012-05-08 08:00:00' ) t
ON
   cars.cardata = t.car
WHERE
   t.car IS NULL;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson