2012-04-17 3 views
1

Таблица Название: MRM_BOOKING_DETAILS
Образец данных:SQLite подзапрос не работает

Booking_id USER_ID ROOM_ID CHECKIN    CHECKOUT 
1   hary 1  2012-04-16 09:00:00 2012-04-16 09:30:00 
2   jenny 2  2012-04-17 13:00:00 2012-04-17 13:30:00 
3   steve 1  2012-04-16 15:00:00 2012-04-16 15:30:00 

и так далее ...

Booking_id является первичным ключом. Room_Id - это Иностранный ключ w.r.t. Room_Details_Table, имеющий Room_Id как ПК.

Моя цель - получить список доступных записей в определенный день, конкретное время, введенное пользователем. Для делать это я придумал этот запрос:

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (SELECT distinct roomid 
       FROM MRM_BOOKING_DETAILS 
       WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
        and (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
    AND CAPACITY > 15 AND PROJECTIONSTATUS = 'NO'; 

Capacity и ProjectionStatus столбцы в деталях номер таблицы, игнорируйте эту часть как сейчас.

CHECKIN и CHECKOUT - это значения, предоставленные пользователем на экране поиска.

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

SELECT distinct roomid 
FROM MRM_BOOKING_DETAILS 
WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') and 
     (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00'); 

Вот почему я говорю, что подзапрос неверен. Предположим, что значения, предоставленные пользователем, являются:

CHECKIN : 2012-04-16 09:00:00 and CHECKOUT: 2012-04-16 09:30:00 

С учетом указанных выше данных в таблице, оба ROOM_ID 1 и 2 будут возвращены. Для первой строки она не удастся, но она будет успешной для второй и третьей строк, в результате она вернет как 1, так и 2, что неверно. Правильный результат должен быть только 2.

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

ответ

1

Измените свою логику от «комнат, которые бронируются в разное время, кроме х», до «номеров, которые не забронированы в разное время».

Кроме того, вы, вероятно, должны использовать функцию DATETIME.

UPDATE

Я добавил проверку на всех перекрестках, и я не использую инклюзивный BETWEEN так, что номер может быть забронирован с 8:30 до 9:00 и с 9:00 до 9: 30.

SELECT ROOMNO, BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID NOT IN (
    SELECT DISTINCT ROOM_ID as ROOMID 
    FROM MRM_BOOKING_DETAILS 
    WHERE (DATETIME(CHECKIN) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKIN) < DATETIME('2012-04-16 09:31:00')) 
     OR (DATETIME(CHECKOUT) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKOUT) < DATETIME('2012-04-16 09:31:00')) 
     OR (DATETIME('2012-04-16 08:30:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 08:30:00') < DATETIME(CHECKOUT)) 
     OR (DATETIME('2012-04-16 09:31:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 09:31:00') < DATETIME(CHECKOUT)) 
) 
    AND CAPACITY > 15 
    AND PROJECTIONSTATUS = 'NO'; 
1

Sqlite не поддерживает сопоставление даты, когда даты являются строками. Для этого вам нужно преобразовать все даты базы данных в числа.

Смежные вопросы