Sql查询相同表中的重叠日期

Sql查询相同表中的重叠日期,sql,sql-server,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, [custom

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

我可以通过几个查询和循环来实现这一点,但我想知道,如果只通过一个查询(表连接到自身),是否可以提高效率

表格结构为:

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)
因此,给定相同的房间id,我希望能够查询是否有任何具有相同房间id的其他预订在具有相同房间id的另一个预订的签入和签出之间(以避免重复预订)

由于现有的项目,我不得不使用普通代码,而不是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
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入
是否有人可以帮助优化查询以仅返回房间id相同且存在重叠的记录

谢谢你的帮助


标记

我认为您的问题在于您将每一行与其自身交叉,这就是您的查询返回所有行的原因。确保
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
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入并
r1.ID r2.ID

我认为您的问题在于您将每一行与自身交叉,这就是为什么您的查询返回所有行。确保
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
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入并
r1.ID r2.ID

杀死r1.id为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
选择r2.ID、r2.room\u ID、r2.check\u in、r2.check\u out、r1.customer\u ref
从tblRentals作为r1
内部连接TBL构件,如r1上的r2。房间id=r2。房间id
和r2。在r1.签入和r1.签出之间签入
和r1.id r2.id

杀死r1.id为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
选择r2.ID、r2.room\u ID、r2.check\u in、r2.check\u out、r1.customer\u ref
从tblRentals作为r1
内部连接TBL构件,如r1上的r2。房间id=r2。房间id
和r2。在r1.签入和r1.签出之间签入
和r1.id r2.id

注意:操作员
=不是ISO标准。仅适用于Microsoft。请使用
。注意:操作员
=不是ISO标准。仅适用于Microsoft。请使用