如何在sql server的两个表内循环查找日期范围
本文关键字:两个 循环 查找 范围 日期 sql server | 更新日期: 2023-09-27 18:13:06
请,谁能给我任何想法如何获得所有日期单独在另一个表的日期范围内。
如何做'不包括18和19'也:我如何重写存储过程,使其不计入预订表状态'已占用'的可用中间日期(18,19)。
我在预订表中有日期范围:
CheckInDate (07/16/2014 12:00:00 AM)
CheckOutDate (07/20/2014 13:00:00 PM)
RoomNumber CheckInDate CheckOutDate Status
204 07/16/2014 12:00:00 AM 07/20/2014 13:00:00 PM Occupied
但是在我的AvailableTest
表中,没有日期范围。所有的记录都在消失个人约会。但是在预订表中,他们没有单独的日期。它们具有范围,以及如何将该日期范围与AvailableTest
表中的个人日期相匹配。
RoomNumber CheckInDate CheckOutDate Status
204 07/16/2014 12:00:00 AM 07/16/2014 13:00:00 PM Available
204 07/17/2014 12:00:00 AM 07/17/2014 13:00:00 PM Available
204 07/18/2014 12:00:00 AM 07/18/2014 13:00:00 PM Available
204 07/19/2014 12:00:00 AM 07/19/2014 13:00:00 PM Available
204 07/20/2014 12:00:00 AM 07/20/2014 13:00:00 PM Available
如果有人检查了2014年7月18日至2014年7月24日范围内的可用房间
204 07/18/2014 12:00:00 AM 07/18/2014 13:00:00 PM Available
204 07/19/2014 12:00:00 AM 07/19/2014 13:00:00 PM Available
204 07/20/2014 12:00:00 AM 07/20/2014 13:00:00 PM Available
应该不再可用了,但当我试图查询时,他们只取出
204 07/20/2014 12:00:00 AM 07/20/2014 13:00:00 PM Available
和18和19仍然是可用的。
看起来他们只知道并试图匹配checkindate
和checkoutdate
只有这样,他们才会在18到24的日期范围内检查16和20(检查可用)。他们不知道18号和19号也有人。
这是我的查询
select distinct (at.RoomNumber), at.RoomID, '', '', '', '', '', '', at.CheckInDate, at.CheckOutDate
from AvailableTest at
join Room r on r.RoomID = at.RoomID
join Reservations res on res.RoomID =r.RoomID where
((at.CheckInDate between '07/18/2014 13:00:00 PM' and '07/24/2014 12:00:00 AM')
or (at.CheckOutDate between '07/18/2014 13:00:00 PM' and '07/24/2014 12:00:00 AM'))
and at.CheckOutDate not in ( SELECT CheckOutDate
FROM reservations rs WHERE ((CheckInDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM') OR (CheckOutDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM')) ) and at.CheckInDate not in ( SELECT CheckInDate FROM reservations rs WHERE ((at.CheckInDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM') OR (at.CheckOutDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM')) )'
我认为您希望只从AvailableTest表中获取reservation表中没有行的日期。
SELECT DISTINCT
r.RoomNumber,
at.RoomID ,
'' ,
'' ,
'' ,
'' ,
'' ,
'' ,
at.CheckInDate ,
at.CheckOutDate
FROM AvailableTest at
INNER JOIN Room r
ON r.RoomID = at.RoomID
INNER JOIN Reservations res
ON res.RoomID = r.RoomID
WHERE at.CheckInDate NOT BETWEEN res.CheckInDate AND res.CheckOutDate
你的可用测试表有一些设计问题。看起来您有一个签入/结帐列,尽管只有一个日期的行。只是增加了不必要的复杂性。