SQL Server:今天不等于今天

SQL Server:今天不等于今天,sql,sql-server,sql-server-2016,getdate,Sql,Sql Server,Sql Server 2016,Getdate,也许我犯了一个明显的错误,但谁能解释一下这里发生了什么?我运行了一个查询,其中表的字段是datetime,我运行的查询类似于 SELECT * FROM Table WHERE DateTimeColumn <= '20170714' 您可以这样更改查询: SELECT * FROM Table WHERE CONVERT(date, DateTimeColumn) <= '20170714' 选择* 从桌子上 其中CONVERT(date,DateTimeColumn)

也许我犯了一个明显的错误,但谁能解释一下这里发生了什么?我运行了一个查询,其中表的字段是datetime,我运行的查询类似于

SELECT *
FROM Table
WHERE DateTimeColumn <= '20170714'

您可以这样更改查询:

SELECT *
  FROM Table
  WHERE CONVERT(date, DateTimeColumn) <= '20170714'
选择*
从桌子上

其中CONVERT(date,DateTimeColumn)只需使用小于2017-07-15(明天)的值

选择*
从桌子上
其中DateTimeColumn<'20170715'
如果要使用getdate,请尝试以下操作:

SELECT *
FROM Table
WHERE DateTimeColumn < dateadd(day,1,cast(getdate() as date))
选择*
从桌子上
其中DateTimeColumn
使用sargable谓词。不要将数据转换为适合筛选谓词,这会影响索引访问和/或需要不必要的计算


还要注意的是,23:59:59不是一天的结束,它比一整天短了整整一秒钟:datetime精确到大约3毫秒,datetime2更为敏感

@juergend@d2怎么样?您确定您有DateTimeColumn 20170713吗?您是否尝试过按日期时间列排序以清楚地看到它?@Dennisuteja是的,它们停在20170713注意:@d2的情况是您将“20170714 11:59:59”转换为一个
日期
而不是
日期时间
,使其等同于“20170714 00:00:00”(因为
DATE
数据类型会删除时间组件,这意味着如果将其转换回
DATETIME
则时间组件将为0-使其为00:00:00.000)…在比较日期和日期时间时要小心。实际上,我已经尝试过了,但没有效果。但我无法创建示例代码来说明问题。
WHERE CONVERT(date,DateTimeColumn)对不起,我的意思是
'20170714 23:59:59'
您能否共享表中的一些行,我怀疑您是否使用UTC之类的格式存储时间。
where cast(DateTimeColumn as date)@GSerg仅适用于某些最新版本的SQL Server中的sargable。它不是一个典型的sargable谓词,经验法则是:不要对数据应用函数,对于那些正在学习“sargable”的人来说,更容易遵守该规则。在任何情况下,对数据使用cast()都是不必要的计算(如前所述)因为有一个完全简单的替代方案,根本不需要铸造数据。
SELECT *
FROM Table
WHERE DateTimeColumn < '20170715'
SELECT *
FROM Table
WHERE DateTimeColumn < dateadd(day,1,cast(getdate() as date))