【问题标题】:How do I phrase this condition in T-SQL syntax?如何在 T-SQL 语法中表达这个条件?
【发布时间】:2018-08-28 07:45:29
【问题描述】:

我在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期间在场的所有员工。

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

【问题讨论】:

    标签: sql sql-server tsql date


    【解决方案1】:

    我想这就是你所追求的:

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

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

    【讨论】:

    • 我们是不是想念在 2016 年 7 月 1 日到 2017 年 6 月 30 日之间加入 (DateOfentry) 的人?
    • 你是指拥有 NULL DateLeft 的人吗?
    • 对不起。我搞砸了。我以为 2016-07-01 在你的代码的第一行!
    • 不用担心。 :) --(无缘无故的额外字符)
    【解决方案2】:

    “在 2016 年 7 月 1 日和 2017 年 6 月 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';
    

    请注意,当使用 'between' 开始和结束值时,例如,假设您要排除范围内的最后一个日期,您将需要使用大于或等于/小于运算符

    SELECT *
    FROM <Table>
    WHERE DateLeft >= '2017-06-30' and DateLeft < '2016-07-01';
    

    【讨论】:

      【解决方案3】:

      我认为你需要这样的东西。

      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)
      

      【讨论】:

      • 谢谢,但您的解决方案还包括 DateOfEntry 为 > 2017-06-30 的人
      • 试试这个,SELECT * FROM @Employee WHERE (DATEDIFF(DAY,DateLeft,@StartDate) = 0) OR ((DATEDIFF(DAY ,DateLeft,@StartDate) 0 )
      【解决方案4】:

      试试这个:

      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 - 如果需要,您可以在此处找到更多详细信息和示例 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多