【问题标题】:How to script a SQL "between" that does not include the same day如何编写不包括同一天的 SQL“之间”
【发布时间】:2011-11-18 16:58:21
【问题描述】:

我希望检索myDate 介于startDate 和“endDate”之间的所有记录,但不要返回日期完全相同的记录。我正在使用 MS SQL 2005。

我试过了:

Select *
From myDatabase
Where empId = 145
and myDate between startDate and endDate

但如果 myDate 是 '11/16/2011',则上述查询将返回具有 startDateendDate = '11/16/2011' 的记录。这不是我想要的。我不想要有 startDateendDate = myDate 的记录

所以我尝试了:

Select *
From myDatabase
Where empId = 145
and myDate between startDate and endDate
and (myDate <> startDate AND myDate <> endDate)

这适用于所有情况吗?

【问题讨论】:

  • 是否要包含 myDate 可以是 startDate 和 endDate 之一但不能同时是两者的记录?
  • 我想排除 myDate 的记录。

标签: sql sql-server-2005 date logic between


【解决方案1】:

a1ex07 是正确的,因为它会起作用

myDate > startDate AND myDate < endDate

如果你坚持使用BETWEEN,那么这也可以

mydate BETWEEN startDate + INTERVAL 1 DAY AND endDate - INTERVAL 1 DAY

编辑:刚刚看到 SQL Server 不是 MySQL 的标签,所以上面是 MySQL,SQL Server 等价物是

myDate BETWEEN DATEADD(DAY, 1, startDate) AND DATEADD(DAY, -1, endDate)

【讨论】:

  • 请注意,只要等式中有时间,您的解决方案就不是真正等效的(SQL Server 2005 总是如此,因为纯 date 类型是在 2008 版中引入的)。
  • @Lucero 不确定我是否遵循您在评论中的意思?如果时间在日期中,则简单保持不变。 DATEADD(DAY, 1, '2011-11-18 05:00:00') = 2011-11-19 05:00:00'2011-11-18 05:00:00' + INTERVAL 1 DAY = 2011-11-19 05:00:00
  • 谢谢,我确保将所有时间设置为 00:00:00.00
  • @Lucero NM Lucero 我仔细考虑后明白了你的意思,因为他只是不想包含等于 myDate 的日期,那么如果日期是 2011-11-18 05:00:00 而你只需添加 +1 天要获得2011-11-19 05:00:00,那么您将错过从2011-11-19 00:00:002011-11-19 04:59:59 的所有记录。这也适用于使用 > 和
  • @JeffWilbert,确切地说,这就是我所指的。但是无论如何,带有时间分量的日期都是危险的野兽......如果你不小心,你可能会因为时区、DST 变化或其他与不在任何地方使用 UTC 相关的问题而遇到麻烦。但这并没有真正使这里的任何解决方案变得更好或更糟,它只是对 CodingIsAwesome 的观察和提示/警告。 ;)
【解决方案2】:

我不明白你为什么必须使用BETWEEN...只要myDate>startDate AND myDate<endDate 就可以了。

【讨论】:

    【解决方案3】:

    假设您想要包含 myDate 可以是 startDate 和 endDate 之一但不能同时是两者的记录,这应该可以:

    Select *
    From myDatabase
    Where empId = 145
    and myDate between startDate and endDate
    and startDate <> endDate
    

    【讨论】:

      【解决方案4】:

      您需要使用BETWEEN 以外的其他内容。试试这个:

      SELECT *
      FROM myDatabase
      WHERE empID = 145
      AND (myDate > startDate) and (myDate < endDate)
      

      【讨论】:

        【解决方案5】:

        BETWEEN 使用 &gt;=&lt;=

        如果您不希望它与端点匹配,则只需使用 &gt;&lt;

        SELECT *
        FROM myDatabase
        WHERE empId = 145
        AND myDate>startDate and myDate<startDate;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-09
          • 2013-04-27
          • 1970-01-01
          • 2014-12-30
          • 1970-01-01
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          相关资源
          最近更新 更多