Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用between子句筛选出2个不同的日期时间字段_Sql_Sql Server_Common Table Expression_Between - Fatal编程技术网

Sql 如何使用between子句筛选出2个不同的日期时间字段

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

我需要实施一个大厅预订系统,需要根据从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 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的情况的结果如何?谢谢。我正在研究你的答案。我会再打给你