MS SQL 服务器查询以检查大厅是否已预订

MS SQL Server Query to Check if Hall is Booked

这个查询快把我逼疯了,感谢任何帮助。

我有一个table如下:


CREATE TABLE Bookings
(
    Id bigInt IDENTITY(1,1),
    hallId bigInt,
    startTime smallDateTime,
    endTime smallDateTime
)

INSERT INTO Bookings 
VALUES (1, '2022-10-03 08:00:00', '2022-10-03 10:00:00') 

--Edit( One of my trials so far

DECLARE @startTime AS SmallDateTime = '2022-10-03 08:00:00'
DECLARE @endTime AS SmallDateTime = '2022-10-03 10:0:00'    
DECLARE @hallId AS bigInt = 1

SELECT * FROM Bookings WHERE 
            startTime >= FORMAT(@startTime, 'yyyy-dd-MM HH:mm:ss') OR startTime <= FORMAT(@endTime, 'yyyy-dd-MM HH:mm:ss') AND
            endTime >=  FORMAT(@startTime, 'yyyy-dd-MM HH:mm:ss') OR endtime <= FORMAT(@endTime, 'yyyy-dd-MM HH:mm:ss') 
AND hallId=@hallId

-- Also this Way 

DECLARE @startTime AS SmallDateTime = '2022-03-10 08:00:00'
DECLARE @endTime AS SmallDateTime = '2022-03-10 10:0:00'    
DECLARE @hallId AS bigInt = 1

SELECT * FROM Bookings WHERE 
      startTime >= @startTime OR startTime <= @endTime
          AND
      endTime >= @startTime OR endtime <= @endTime 
      AND hallId=@hallId

--Edit)

我的日期时间格式是 'yyyy-MM-dd HH:mm:ss' 但它的记录是以 yyyy-dd-MM HH:mm:ss 格式输入的

所以我想要的是一个检查 2 个日期时间范围的查询(比如 2022-10-03 08:00:00 - 2022-10-03 10:00:00),如果有匹配项 returns 数据否则它 returns 什么都没有。

我的目标是检查 startTime 或 endTime 是否在现有预订范围内(例如 None 的 startTime 或 endTime 不能在 '2022-10-03 08:00:00' 内直到 '2022-10-03 10:00:00'),如果找到,除非 he/she 必须更改,否则不能提前预订。我尝试过,但似乎以一种方式工作而另一种方式失败

如果有人可以单独登记,即显示特定的 message/status 开始时间和结束时间(我的意思是如果开始时间对应于现有的预订消息='Select a different start time' 并且如果endTime对应现有的Booking msg='Select a different end time'

我还尝试检查 startTime 和 endTime 的差异是否小于 1 小时。

BWT,我正在使用 SQL Server 2014 Express

您可以INSERT...SELECT...WHERE NOT EXISTS,然后检查行数。要比较间隔重叠,将一个开始时间与另一端进行比较,反之亦然。

Note that you should always specify column names for inserts, and pass values as parameters, not text.

INSERT INTO Bookings (hallId, startTime, endTime)
SELECT @hallId, @startTime, @endTime
WHERE NOT EXISTS (SELECT 1
    FROM Bookings b WITH (UPDLOCK)  -- needs UPDLOCK to prevent race conditions
    WHERE b.hallId = @hallId
      AND b.startTime < @endTime
      AND b.endTime > @startTime
);

IF @@ROWCOUNT = 0
    THROW 50001, N'Overlapping booking exists', 1;

如果您不想让两个间隔邻接,您可能需要更改为 <=

感谢曾试图提供帮助的人,我想通了,

Sometimes all you need is to take a quick break.

我发现 smallDateTime data type 表现得很疯狂,它在插入 table

时交换月份和日期

例如,如果我插入 2022-03-15 20:00:00,它将被记录为 2022-15-03 20:00:00 和 vice-versa

下面是对我有用的东西,它可能会在近期或远期对某人有所帮助

   -- 2022-03-11 13:30:00, 2022-03-11 15:00:00 => sample data 1 in the table 

   -- 2022-03-11 09:30:00, 2022-03-11 12:30:00 => sample data 2 in the table

    
    DECLARE @startTime AS SmallDateTime = '2022-03-11 15:01:00'
    DECLARE @endTime AS SmallDateTime =   '2022-03-11 19:30:00' 
    DECLARE @hallId AS bigInt = 1


    SELECT * FROM Bookings WHERE 
    (startTime BETWEEN @startTime AND @endTime) OR 
    (endTime BETWEEN @startTime AND @endTime) AND hallId=@hallId