SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 24.06.2010 03:23:14

like2dev
Участник
Зарегистрирован: 27.04.2010
Сообщений: 18

Улучшить запрос (с датой)

Есть таблица:


CREATE TABLE `employed_room` (
`id` SMALLINT( 4 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`boardroom_id` TINYINT( 3 ) UNSIGNED NOT NULL ,
`employee_id` TINYINT( 3 ) UNSIGNED NOT NULL ,
`notes` VARCHAR( 255 ) NOT NULL ,
`submitted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`begin` TIMESTAMP NOT NULL ,
`end` TIMESTAMP NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
 

Надо составить запрос который находит данные на определенном интервале даты и времени
вот такой запрос составил:

/* Поиск существующих записей на интервале */

SELECT
    COUNT(`employed_room` . `id`)
FROM
    `employed_room`    
WHERE
    `employed_room` . `boardroom_id` = 1
AND
    (TIME(`employed_room` . `begin`) BETWEEN '07:00:00' AND '08:00:00')
AND
    (TIME(`employed_room` . `end`)   BETWEEN '07:00:00' AND '08:00:00')    
AND
    (DATE(`employed_room` . `begin`) BETWEEN '2010-06-24' AND '2010-06-26')
AND
    (DATE(`employed_room` . `end`)   BETWEEN '2010-06-24' AND '2010-06-26')
 


Если нужно переделать таблицу или запрос, то скажите как.

Неактивен

 

#2 24.06.2010 10:12:08

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

Re: Улучшить запрос (с датой)

А почему не сделать просто
WHERE begin < '2010-06-24 07:00:00' AND end > '2010-06-24 08:00:00' ?

Неактивен

 

#3 24.06.2010 16:24:35

like2dev
Участник
Зарегистрирован: 27.04.2010
Сообщений: 18

Re: Улучшить запрос (с датой)

потому что зал который занят на 7: 30: 00  : 7: 45: 00 в результат данного запроса не попадет

Неактивен

 

#4 24.06.2010 16:47:28

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

Re: Улучшить запрос (с датой)

Схитрю и поменяю чиселки местами wink

WHERE begin < '2010-06-24 08:00:00' AND end > '2010-06-24 07:00:00' ?

Неактивен

 

#5 24.06.2010 17:47:30

like2dev
Участник
Зарегистрирован: 27.04.2010
Сообщений: 18

Re: Улучшить запрос (с датой)


SELECT
    *
FROM
    `employed_room`    
WHERE
    `employed_room` . `boardroom_id` = 1
AND
     (TIME(begin) < '08:00:00' AND TIME(end) > '07:00:00')
AND
     (DATE(begin) >='2010-06-24' AND DATE(begin) <= '2010-06-26')
 

вот так наверное, запрос который выше не учитывает интвервал дней.
И я думаю может лучше переписать таблицу
вместо полей begin,end - сделать
date DATE
time_b TIME
time_e TIME
чтобы не использовать ф-ции преобразования, или не стоит?

Неактивен

 

#6 24.06.2010 18:07:41

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

Re: Улучшить запрос (с датой)

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

Или в чем смысл запроса? Показать, занята ли переговорка во временной интервал?
Или показать, занята ли переговорка каждый день с 7 до 9?

Неактивен

 

#7 24.06.2010 18:32:31

like2dev
Участник
Зарегистрирован: 27.04.2010
Сообщений: 18

Re: Улучшить запрос (с датой)

Goals :
При занятии зала заседаний , проверить свободный ли он на данную дату в данное время.
Так же там есть возможность рекурсивно заполнить на 1 недел, 2 недели, мес.

Соответсвенно , нам нужно проверить На 1,2,4 недели вперед на данное время зал.

Неактивен

 

#8 24.06.2010 19:57:53

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

Re: Улучшить запрос (с датой)

Хм. Давайте тогда напишу кучку мыслей, а Вы подумаете, как лучше сделать smile

1. Если Вы используете функцию над полем, то индексы использовать не полу-
чится никогда. Поэтому TIME(begin) — самое плохое, что можно придумать.

2. Скорее всего, зал не бронируется на ночь, поэтому можно отделить три поля
`date` DATE, `begin` TIME, `end` TIME. Так Вы по крайней мере сможете по
индексу вытащить строки с нужной датой.

3. Если держать одно поле, то самым эффективным с точки зрения индекса явля-
ется случай, когда оно одно (т.е. нет begin и end). Тут можно сделать какую-то
денормализацию.

Неактивен

 

#9 25.06.2010 10:01:20

like2dev
Участник
Зарегистрирован: 27.04.2010
Сообщений: 18

Re: Улучшить запрос (с датой)

2 вариант

Неактивен

 

Board footer

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