Sql 如何使用between子句筛选出2个不同的日期时间字段
我需要实施一个大厅预订系统,需要根据从DateTime到ToDateTime的预订情况获得免费大厅Sql 如何使用between子句筛选出2个不同的日期时间字段,sql,sql-server,common-table-expression,between,Sql,Sql Server,Common Table Expression,Between,我需要实施一个大厅预订系统,需要根据从DateTime到ToDateTime的预订情况获得免费大厅 DECLARE @ProdTimes TABLE (Dates DATETIME) DECLARE @PRowCount INT = (SELECT COUNT(*) FROM @TempOrderDateTime) WHILE(@PRowCount>0) BEGIN DECLARE @TopFromDateTime DATETIME = (SELECT TOP(1)FromDateTime
DECLARE @ProdTimes TABLE (Dates DATETIME)
DECLARE @PRowCount INT = (SELECT COUNT(*) FROM @TempOrderDateTime)
WHILE(@PRowCount>0)
BEGIN
DECLARE @TopFromDateTime DATETIME = (SELECT TOP(1)FromDateTime FROM
@TempOrderDateTime)
DECLARE @TopToDateTime DATETIME = (SELECT TOP(1)ToDateTime FROM @TempOrderDateTime)
;WITH Dates_CTE
AS (SELECT @TopFromDateTime AS Dates
UNION ALL
SELECT DATEADD(HOUR, 1, Dates)
FROM Dates_CTE
WHERE Dates < @TopToDateTime)
INSERT INTO @ProdTimes
SELECT Dates
FROM Dates_CTE AS t
OPTION (MAXRECURSION 0);
DELETE TOP(1) FROM @TempOrderDateTime
SET @PRowCount = (SELECT COUNT(*) FROM @TempOrderDateTime)
END
订单表
HallID FromDateTime ToDateTime
1 2018-01-01 03:00:00 2018-01-01 05:00:00
2 2018-01-01 06:30:00 2018-01-01 12:00:00
3 2018-01-01 13:00:00 2018-01-01 15:15:00
用户应该能够输入FromDateTime到ToDateTime,以检查Order表中是否有记录。如果存在,则大厅不可预订
SELECT * FROM @PTimes p
WHERE EXISTS (SELECT 1 FROM @ProdTimes pt WHERE p.Dates = pt.Dates)
测试场景:输入
FromDateTime ToDateTime Result
2018-01-01 03:00:00 2018-01-01 05:00:00 : Hall not available
2018-01-01 08:45:00 2018-01-01 10:30:00 : Hall not available (This time is between Hall ID 2s booking time)
2018-01-01 15:30:00 2018-01-01 18:00:00 : Hall available
问题:
在这个场景中,是否可以使用FromDateTime和ToDateTime中的between子句来解决这个问题?
我无法找到一种方法来使用中间,所以我使用了下面的方法。但是它的成本非常高
-- Selecting all the records related to perticular product(hall) in to a temp table.
DECLARE @TempOrderDateTime TABLE (FromDateTime DATETIME,ToDateTime DATETIME)
INSERT INTO @TempOrderDateTime
SELECT FromDateTime,ToDateTime
FROM [Order].[Order]
WHERE ProductID = 7
将每个记录拆分为1小时药水并存储在临时表中。这就产生了另一个问题
问题是,如果我使用1小时分段算法,将无法处理FromDateTime或ToDateTime中有分钟的记录
DECLARE @ProdTimes TABLE (Dates DATETIME)
DECLARE @PRowCount INT = (SELECT COUNT(*) FROM @TempOrderDateTime)
WHILE(@PRowCount>0)
BEGIN
DECLARE @TopFromDateTime DATETIME = (SELECT TOP(1)FromDateTime FROM
@TempOrderDateTime)
DECLARE @TopToDateTime DATETIME = (SELECT TOP(1)ToDateTime FROM @TempOrderDateTime)
;WITH Dates_CTE
AS (SELECT @TopFromDateTime AS Dates
UNION ALL
SELECT DATEADD(HOUR, 1, Dates)
FROM Dates_CTE
WHERE Dates < @TopToDateTime)
INSERT INTO @ProdTimes
SELECT Dates
FROM Dates_CTE AS t
OPTION (MAXRECURSION 0);
DELETE TOP(1) FROM @TempOrderDateTime
SET @PRowCount = (SELECT COUNT(*) FROM @TempOrderDateTime)
END
我的方法目前适用。但主要的缺点是
如果订单表记录包含带有分钟的条目,则该算法将不起作用。因为它只过滤掉1小时的药水。
成本很高。
请给我建议一个处理这个问题的正确方法
提前谢谢。我希望我明白了重点,但如果你不愿意,请随时发表评论。 假设用户将在2018-01-01-04:30:00提交请求 日期表:
FromDateTime ToDateTime Result
2018-01-01 03:00:00 2018-01-01 05:00:00 : Hall not available
2018-01-01 08:45:00 2018-01-01 10:30:00 : Hall not available (This time is between Hall ID 2s booking time)
2018-01-01 15:30:00 2018-01-01 18:00:00 : Hall available
您的支票应该是:
DECLARE @UserDateRequest DATETIME = '2018-01-01-04:30:00'
SELECT @UserDateRequest,
Result
FROM DATES
WHERE @UserDateRequests BETWEEN @FromDateTime AND @ToDateTime
你不想在两者之间。逻辑是:
select h.*
from halls h
where not exists (select 1
from orders o
where o.hallid = h.hallid and
o.FromDateTime < @ToDateTime and
o.ToDateTime > @FromDateTime
);
我敢肯定这是解决你问题的最简单的办法。请注意,重叠的定义根本不涉及中间层。如果一个句点在第二个句点之前开始,而在第二个句点之后结束,则两个句点会重叠。当然,对于日期时间格式,可以使用between运算符。这应该是一个正确的语法:如果日期介于@FromDateTime和@ToDateTime之间,那么FromDateTime:2018-01-01 15:00:00 ToDateTime:2018-01-01 18:00:00或FromDateTime:2018-01-01 02:30:00 ToDateTime:2018-01-01 04:00的情况的结果如何?谢谢。我正在研究你的答案。我会再打给你