Как мне сформулировать это условие в синтаксисе T-SQL? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть таблица в SQL Server 2012 с данными о сотрудниках. Выдержка показана ниже:

 empID     DateOfEntry    DateLeft
  102      2015-05-21     2016-04-20
  104      2015-05-14     2015-12-28
  ...

Мне нужно извлечь всех сотрудников, которые присутствовали в течение периода 2016-07-01 и 2017-06-30.

Для этого мне нужно добавить фильтр WHERE к столбцу DateLeft в моем запросе, но я немного запутался в том, как сформулировать эту логику.

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Я думаю, тебе нужно что-то подобное.

DECLARE @Employee TABLE(empID INT,DateOfEntry DATE,DateLeft DATE)
INSERT @Employee
SELECT 101,'2015-05-21','2016-08-20' UNION ALL -- O
SELECT 102,'2015-05-21','2016-04-20' UNION ALL -- X
SELECT 104,'2015-05-14','2015-12-28' UNION ALL -- X
SELECT 105,'2015-05-14','2018-12-28'            -- O

DECLARE @StartDate DATE = '2016-07-01'
DECLARE @EndDate DATE = '2017-06-30'


SELECT * FROM @Employee 
WHERE 
(DATEDIFF(DAY,DateLeft,@StartDate) <=0 AND DATEDIFF(DAY,DateLeft,@EndDate) >= 0)
OR
(DATEDIFF(DAY,DateLeft,@StartDate) <=0 AND DATEDIFF(DAY,DateLeft,@EndDate) <= 0)
0 голосов
/ 28 августа 2018

"все сотрудники, которые присутствовали в период 2016-07-01 и 2017-06-30"

Ваша формулировка подразумевает несколько сценариев, поэтому я рассмотрю все

Если вы хотите, чтобы сотрудники, которые присутствовали именно в эти две даты, используют оператор IN в фильтре where:

SELECT *
FROM <Table>
WHERE DateLeft in ('2016-07-01','2017-06-30');

Если вы хотите, чтобы сотрудники, которые присутствовали в течение этих двух дат, вы можете использовать Синтаксис между:

SELECT *
FROM <Table>
WHERE DateLeft between '2017-06-30' and '2016-07-01';

Обратите внимание, что при использовании начальных и конечных значений 'между' включены значения, поэтому, предполагая, что вы хотите исключить последнюю дату в диапазоне, например, вам нужно будет использовать операторы, большие или равные / меньшие, чем

SELECT *
FROM <Table>
WHERE DateLeft >= '2017-06-30' and DateLeft < '2016-07-01';
0 голосов
/ 28 августа 2018

Я думаю, это то, что вы ищете:

WHERE DateOfEntry <= '2017-06-30'
    and DateLeft >= '2016-07-01'

Вы можете думать о своем вопросе как о «людях, которые начали до (или в) вашей последней даты и оставили после (или в) вашей самой ранней даты».

0 голосов
/ 28 августа 2018

Попробуйте это:

SELECT *
FROM [mytable]
WHERE [DateOfEntry] >= '2016-07-01'
   AND [DateLeft] <= '2017-06-30';

Кроме того, при работе с датами и диапазонами не используйте BETWEEN, даже если некоторые люди собираются показать вам синтаксис.

Если быть точным, вам следует избегать передачи дат в виде строки и в этом формате:

YYYY-MM-DD

Как это может сломаться при определенных сценариях - например, когда языковые настройки пользователя установлены на французский:

SET LANGUAGE FRENCH;
GO
SELECT CONVERT(DATETIME, '2009-10-13');

Вместо этого вы можете использовать YYYYMMDD.

Аарон Бертран имеет хорошую статью о датах и ​​диапазонах дат, часть его серии - Bad habits to kick - вы можете найти более подробную информацию и примеры там, если хотите: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...