我正在使用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-SQL
至2013-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
这只是一个例子。基本上,我希望针对可以根据开始日期和结束日期灵活选择任何停留时间的方案实施逻辑。 注意:开始日期可能与结束日期位于不同的月份
答案 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