如何在T-SQL语法中表达此条件?

时间:2018-08-28 07:45:30

标签: sql sql-server tsql date

我在SQL Server 2012中有一个表,上面有员工数据。摘录如下所示:

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

我需要提取在2016-07-012017-06-30期间在场的所有员工。

为此,我需要在查询的WHERE列上添加一个DateLeft过滤器,但对于如何表达此逻辑我有些困惑。

4 个答案:

答案 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)