代码之家  ›  专栏  ›  技术社区  ›  user3115933

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

  •  0
  • user3115933  · 技术社区  · 6 年前

    我有张桌子 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 回复  |  直到 6 年前
        1
  •  2
  •   MJH    6 年前

    我想这就是你想要的:

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

    你可以把你的问题想象成“在你最近的约会之前(或当天)开始,在你最早的约会之后(或当天)离开的人”。

        2
  •  0
  •   Y.S    6 年前

    “在2016-07-01和2017-06-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
  •   Maharajan    6 年前

    我想你需要这样的东西。

    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)
    
        4
  •  0
  •   gotqn user3521065    6 年前

    试试这个:

    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 相反。

    亚伦·伯特兰很好 article 关于日期和日期范围,他系列的一部分- Bad habits to kick -如果需要,您可以在这里找到更多详细信息和示例:-)