我在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
过滤器,但对于如何表达此逻辑我有些困惑。
答案 0 :(得分:2)
我想这就是你所追求的:
WHERE DateOfEntry <= '2017-06-30'
and DateLeft >= '2016-07-01'
您可以认为您的问题是“在您的最新日期之前(或之前)开始,而在最早的日期之后(或之后)离开的人”。
答案 1 :(得分: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
-如果需要的话,您可以在此处找到更多详细信息和示例:
答案 2 :(得分:0)
“ 2016年7月1日至2017年6月30日期间在场的所有员工”
您的措词暗示了几种情况,所以我将解决所有问题
如果您希望具体在这两个日期出现的员工,请在where过滤器中使用IN运算符:
SELECT *
FROM <Table>
WHERE DateLeft in ('2016-07-01','2017-06-30');
如果您希望在这两个日期范围内都在场的员工可以使用 'between'语法:
SELECT *
FROM <Table>
WHERE DateLeft between '2017-06-30' and '2016-07-01';
请注意,当使用'between'时,包括开始和结束值,因此,例如,假设您要排除范围中的最后一个日期,则需要使用大于或等于/小于等于的运算符
SELECT *
FROM <Table>
WHERE DateLeft >= '2017-06-30' and DateLeft < '2016-07-01';
答案 3 :(得分:0)
我认为您需要这样的东西。
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)