Sql查询同一个表以查找重叠日期

时间:2015-06-13 21:30:09

标签: sql sql-server

我试图编写一个查询,其中将报告日期范围内的任何重叠。

我能够通过多个查询和循环来完成这项工作,但我想知道是否可以通过一个查询来提高效率,表格会自动加入。

表结构是:

CREATE TABLE [dbo].[Rentals](
[ID] [int] IDENTITY(1,1) NOT NULL,
[room_id] [int] NOT NULL,
[check_in] [datetime] NOT NULL,
[check_out] [datetime] NOT NULL,
[customer_ref] [bigint] NULL)

所以给定相同的room_id,我希望能够查询具有相同room_id的任何其他预订是否在具有相同room_id的另一个预订的check_in和check_out之间(以避免双重预订)。

由于现有项目,我必须使用普通代码,而不是LINQ。

这是我到目前为止所做的,但它似乎正在返回所有记录:

SELECT     r1.ID, r1.room_id, r1.check_in, r1.check_out,r1.customer_ref
FROM       tblRental AS r1 INNER JOIN
                  tblRental AS r2 ON 
                     r1.room_id = r2.room_id AND 
                     r1.check_in < r2.check_out AND 
                     r1.check_out > r2.check_in

任何人都可以帮助优化查询以仅返回room_id相同的记录,并且存在重叠吗?

感谢您的帮助,

标记

2 个答案:

答案 0 :(得分:4)

我认为你的问题是你自己越过每一行,这就是你的查询返回所有行的原因。确保r1.ID <> r2.ID

SELECT     r1.ID, r1.room_id, r1.check_in, r1.check_out,r1.customer_ref
FROM       tblRental AS r1 INNER JOIN
                  tblRental AS r2 ON 
                     r1.room_id = r2.room_id AND 
                     r1.check_in < r2.check_out AND 
                     r1.check_out > r2.check_in AND
                     r1.ID <> r2.ID

答案 1 :(得分:0)

用r1.id&lt;&gt;杀死双行r2.id.
您对谓词也有一点逻辑错误。使用介于两者之间的东西可能会更清楚一些。 ;)
使用此查询时,您可能希望输出r2。

SELECT r2.ID, r2.room_id, r2.check_in, r2.check_out, r1.customer_ref
FROM tblRentals AS r1 
    INNER JOIN tblRentals AS r2 ON r1.room_id = r2.room_id
    and r2.check_in between r1.check_in and r1.check_out
    and r1.id <> r2.id