Как извлечь все записи на основе даты начала и окончания в следующем контексте? - PullRequest
0 голосов
/ 05 мая 2019

Я использую 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

Это всего лишь пример. По сути, я хочу, чтобы логика была реализована для сценария, в котором у меня есть возможность выбирать любые периоды пребывания, основанные на дате начала и дате окончания. Примечание. Дата начала может отличаться от даты окончания

1 Ответ

1 голос
/ 05 мая 2019

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...