我在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
过滤器,但我对如何说出这个逻辑感到有点困惑。
我认为这就是你所追求的:
WHERE DateOfEntry <= '2017-06-30'
and DateLeft >= '2016-07-01'
您可以将您的问题视为“在您的最早日期之前(或之后)开始并在您的最早日期之后(或之后)离开的人”。
“所有在2016-07-01和2017-06-30期间在场的员工”
你的措辞意味着几种情况,所以我将解决所有问题
如果您希望具体出现在这两个日期的员工,请在您的where过滤器中使用IN运算符:
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';
我想你需要这样的东西。
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)
试试这个:
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
代替。
Aaron Bertrand有很好的article关于日期和日期范围,他的系列的一部分 - Bad habits to kick
- 你可以在那里找到更多细节和例子,如果你想:-)