All of the love we left behind watching the flashbacks intertwine. I think our lives have just begun.
Народ, помогите, пожалуйста, сформировать запрос.
У меня есть две таблицы: в одной списки всех комнат гостиницы, в другой - информация о посетителях, датах заезда и отъезда и комнатах, которые они занимают. Таблицы связаны ключом RoomID. Дело в том, что могут быть заняты не все комнаты, то есть вторая таблица содержит информацию только о тех комнатах, что заняты.
А теперь смысл запроса: необходимо вывести список всех свободных на заданную дату комнат.
Запрос, который я приведу ниже, выводит список тех комнат, которые заняты, но не на то число, которое я указываю. А нужно, чтобы он выводил список всех свободных комнат плюс те, что заняты, но на другую дату:
Такое ощущение, что запрос полностью игнорирует содержимое таблицы Rooms. Что с этим делать?
У меня есть две таблицы: в одной списки всех комнат гостиницы, в другой - информация о посетителях, датах заезда и отъезда и комнатах, которые они занимают. Таблицы связаны ключом RoomID. Дело в том, что могут быть заняты не все комнаты, то есть вторая таблица содержит информацию только о тех комнатах, что заняты.
А теперь смысл запроса: необходимо вывести список всех свободных на заданную дату комнат.
Запрос, который я приведу ниже, выводит список тех комнат, которые заняты, но не на то число, которое я указываю. А нужно, чтобы он выводил список всех свободных комнат плюс те, что заняты, но на другую дату:
Такое ощущение, что запрос полностью игнорирует содержимое таблицы Rooms. Что с этим делать?
-
-
04.12.2010 в 13:11ALTER PROCEDURE GetFreeRoomsOnDate
@Date datetime
AS
BEGIN
SELECT r.RoomID
FROM Rooms r JOIN Visitors v ON r.RoomID=v.RoomID
WHERE
v.RoomID NOT IN (SELECT RoomID FROM Visitors
WHERE @Date BETWEEN v.ArriveDate AND v.DepartDate)
END
Ну и как один из вариантов написать туда условие еще типа "and v.ArriveDate< @Date"
-
-
05.12.2010 в 00:23-
-
05.12.2010 в 00:43fess2007, я попробую.
Таблица Visitors.
В ней содержатся следующие столбцы (я напишу только те, что нам будут нужны): ID посетителя, дата заселения посетителя в гостиницу, дата выселения и номер комнаты, которую он занимает.
Вот скриншот инфы, которая забита в таблицу:
читать дальше
Таблица Rooms.
В ней 3 столбца: ID комнаты, тип (обычный или люкс) и стоимость в сутки.
Скриншот таблицы:
читать дальше
Как вы можете видеть, в таблице Visitors записаны не все комнаты, что есть в гостинице, а лишь те, что зарезервированы. А запрос должен выдавать все свободные комнаты, а не только те, что в резерве не попали в указанную нами дату.
-
-
05.12.2010 в 19:001) выбрать из таблицы Visitors все комнаты которые не заняты на определенную дату
2) добавить к запросу данные из таблицы rooms которых нет в таблице Visitors в поле RoomID
если я сформулировал правильно то первую часть запроса вы уже написали, осталось добавить вторую
и полный запрос будет выглядеть
-
-
05.12.2010 в 19:14-
-
05.12.2010 в 19:38-
-
05.12.2010 в 20:00к сожалению до гениальности мне далеко, а вообще... если ничего не напутал то этот запрос можно написать немного проще
-
-
05.12.2010 в 20:18-
-
05.12.2010 в 20:24-
-
05.12.2010 в 20:31это типа если в комнате живут 2 человека с одними и те ми же датами ?
-
-
05.12.2010 в 20:39Вот так например:
-
-
05.12.2010 в 21:26-
-
05.12.2010 в 21:49Тут DISTINCT проблему не решил(
-
-
05.12.2010 в 21:55-
-
05.12.2010 в 22:01-
-
05.12.2010 в 22:08вам нужно чтобы на какую то конкретную дату выдавался список комнат которые свободны, так ?
в каких ситуациях вот этот код не отрабатывает ?
-
-
05.12.2010 в 22:31Он даже не выводит комнаты, которые повторяются.
Уфф... ладно, даже знать не хочу, почему раньше это не работало. Спасибо!
Слушайте, у меня тут еще 5 запросов несделанных, если у меня будут вопросы, можно я буду писать вам в личку?
-
-
05.12.2010 в 22:47-
-
05.12.2010 в 23:12И раз уж пока еще вы свободны, может быть найдете время на еще один вопрос? Та же таблица Visitors, те же столбцы. И нужно определить ближайшую дату освобождения номера.
По сути, мы будем сравнивать разницу между сегодняшней датой и DepartDate и выбирать минимальную.
Я предполагаю, что выглядеть это будет примерно так:
Но есть одна проблема - @Visitor не задается, он должен перебирать из всех и выбирать оптимум. Вот этот вариант кода:
выдает ошибку "Cannot perform an aggregate function on an expression containing an aggregate or a subquery." А как еще взять минимум у функции DATEDIFF я не знаю.
-
-
05.12.2010 в 23:39не все так наверное просто - DATEDIFF в случае если DepartDate меньше чем текущая дата вернет положительное число, этот номер нам тоже подходит или все таки берем только те которые "еще" освободятся а не "уже" освободились
-
-
05.12.2010 в 23:50-
-
05.12.2010 в 23:51-
-
05.12.2010 в 23:54определяет комнату и визитера из нее которая освободится раньше всех.
я спать если что пишите, завтра вечером может быть помогу если получиться
-
-
05.12.2010 в 23:59По поводу кода: DATEDIFF(DD,DD,@Todaydate) - второе DD - откуда оно берется? SQL Server выдает ошибку.
И еще mindays - что это?
-
-
06.12.2010 в 00:08mindays - просто алиас который означает max((DATEDIFF(DD,DD,@Todaydate))) из внутреннего подзапроса
-
-
06.12.2010 в 00:21Ух ты, работает! Круто! У меня как раз есть похожий на этот запрос, так что теперь можно считать, что я сделала их оба)
Спасибо огромное, вы так мне помогли!