在以下情况下,如何根据开始日期和结束日期提取所有记录?

时间:2019-05-05 16:15:49

标签: sql sql-server tsql

我正在使用SQL SERVER 2014,并且有一个名为GuestInfo的表,其中包含大约250,000条记录。

以下是GuestInfo表的摘录:

ID    Name       ArrDate        DepDate 
100   P Smith    2013-02-16     2013-02-20
101   A Owen     2013-04-01     2013-04-13
108   M John     2013-04-05     2013-04-08
132   S Walter   2014-06-09     2014-06-11

如果我想提取(例如)所有停留期间为T-SQL2013-04-06的客人,应该如何写我的2013-04-08查询?

所以,这里的预期输出是:

ID     Name     ArrDate        DepDate
101   A Owen     2013-04-01     2013-04-13
108   M John     2013-04-05     2013-04-08

这只是一个例子。基本上,我希望针对可以根据开始日期和结束日期灵活选择任何停留时间的方案实施逻辑。 注意:开始日期可能与结束日期位于不同的月份

1 个答案:

答案 0 :(得分:1)

使用BETWEEN,您可以获得预期的输出:

SELECT *
FROM GuestInfo
WHERE (@StartPeriod BETWEEN ArrDate AND DepDate) AND 
      (@EndPeriod BETWEEN ArrDate AND DepDate)

SELECT *
FROM GuestInfo
WHERE ArrDate <= @StartPeriod AND DepDate >= @EndPeriod

具有给定样本数据的演示:

DECLARE @GuestInfo TABLE (ID INT, Name VARCHAR (50), ArrDate  DATE, DepDate DATE); 

INSERT INTO @GuestInfo ( ID , Name, ArrDate, DepDate) VALUES
(100, 'P Smith' , '2013-02-16', '2013-02-20'),
(101, 'A Owen'  , '2013-04-01', '2013-04-13'),
(108, 'M John'  , '2013-04-05', '2013-04-08'),
(132, 'S Walter', '2014-06-09', '2014-06-11');

DECLARE @StartPeriod AS DATE = '2013-04-06';
DECLARE @EndPeriod   AS DATE = '2013-04-08';

SELECT *
FROM @GuestInfo
WHERE (@StartPeriod BETWEEN ArrDate AND DepDate) AND 
      (@EndPeriod BETWEEN ArrDate AND DepDate)

输出:

ID  Name    ArrDate     DepDate
-----------------------------------
101 A Owen  2013-04-01  2013-04-13
108 M John  2013-04-05  2013-04-08