如何在T-SQL语法中表达这种情况?

问题描述 投票:0回答:4

我在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过滤器,但我对如何说出这个逻辑感到有点困惑。

sql sql-server tsql date
4个回答
2
投票

我认为这就是你所追求的:

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

您可以将您的问题视为“在您的最早日期之前(或之后)开始并在您的最早日期之后(或之后)离开的人”。


0
投票

“所有在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';

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)

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 - 你可以在那里找到更多细节和例子,如果你想:-)

© www.soinside.com 2019 - 2024. All rights reserved.