【问题标题】:BETWEEN operator not comparing dates correctly in SQL Server 2005BETWEEN 运算符在 SQL Server 2005 中未正确比较日期
【发布时间】:2016-05-16 18:52:44
【问题描述】:

我有一个简单的查询:

 SELECT *
 FROM TABLE
 WHERE EventDateTime BETWEEN '2016-05-12 00:00:00' and '2016-05-12 23:59:59'

由于某种原因,查询输出包括日期时间为 2016-05-13 00:00:00 的行。

使用 CAST 将字符串转换为日期时间会删除 2015-05-13 的值:

 SELECT *
 FROM TABLE
 WHERE EventDateTime BETWEEN CAST('2016-05-12 00:00:00' AS DateTime) and CAST('2016-05-12 23:59:59' AS DateTime)

这是什么原因造成的?

【问题讨论】:

  • 您的数据类型是 smalldatetime 吗?文档说 23:59:59 的值将四舍五入。也许使用 >= 和 msdn.microsoft.com/en-us/library/ms182418.aspx
  • @Jeremy 好电话!我认为这就是造成它的原因
  • 顺便说一句:您应该将日期时间文字更改为'YYYY-MM-DDThh:mm:ss'(即'2016-05-12T00:00:00''2016-05-12T23:59:59')。见这里:social.msdn.microsoft.com/Forums/sqlserver/en-US/…

标签: sql sql-server-2005


【解决方案1】:

你应该改用这样的东西:

SELECT *
FROM TABLE
WHERE EventDateTime >= '2016-05-12 00:00:00' 
  AND EventDateTime < '2016-05-13 00:00:00'

BETWEEN 操作符出了名的“棘手”要正确...

【讨论】:

    【解决方案2】:

    您可以选择以下查询。您可以在 Date 中投射 EventDateTime,而不是投射 To 和 From Date。这将返回准确的

     SELECT *
     FROM TABLE
     WHERE CAST(EventDateTime as DATE) ='2016-05-12'
    

    【讨论】:

    • 在 SQL Server 2008 及更高版本中有效,但在 SQL Server 2005 中不存在 Date 类型
    【解决方案3】:

    对于 SQL Server 2005,您可以使用以下代码:

    SELECT *
     FROM TABLE
     WHERE CONVERT(VARCHAR(10),EventDateTime,111) ='2016/05/12'
    

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多