ASP.NET新手求助:GETDATE()相关DateTime查询语句突然失效问题
关于SQL DateTime查询失效的问题分析及解决方案
嘿,作为ASP.NET新手碰到这种SQL查询的坑太正常了,我帮你一步步理清楚~
首先先拆解下你试的三个写法的问题,重点说第一种突然失效的原因:
先看你三个写法的本质
- 第三个写法
Select * from employee where DateTime =getDate():这个本来就很难查到数据,因为getDate()返回的是带具体时分秒毫秒的完整时间(比如2024-05-20 15:40:32.123),除非你的表中DateTime列刚好有和这个时间完全一致的行,否则根本命中不了。 - 第二种写法
Select * from employee where DateTime=Convert(date, getdate()):Convert(date, getdate())会把当前时间转成只保留年月日的Date类型,但数据库会把它隐式转回DateTime(时间部分为00:00:00),所以同样只能查到表中时间刚好是当天0点整的行,不是你要的“当天所有数据”。 - 第一种写法
Select * from employee where DateTime = dateadd(dd,0, datediff(dd,0, getDate())):这个写法的作用是截断当前时间的时分秒部分,得到当天的0点整(比如2024-05-20 00:00:00.000),之前能运行是因为你的表中DateTime列刚好有时间为0点整的行,但它突然失效,大概率是这几个原因:
第一种写法失效的可能原因
- 表中DateTime列的数据类型变更:比如之前是
DateTime类型(精度到毫秒),后来改成了DateTime2(精度到微秒甚至更高)。dateadd/datediff返回的是DateTime类型,和DateTime2比较时,会因为精度差异导致不匹配——比如表中是2024-05-20 00:00:00.0000000,而你的查询返回的是2024-05-20 00:00:00.000,这时候相等比较就会失败。 - 数据插入逻辑变了:之前你插入数据时会把时间截断到0点,后来代码修改后,插入的是完整的带具体时间的DateTime(比如用户提交时间、系统当前时间),这时候表中已经没有0点整的行了,自然查不到数据。
- 服务器时间/配置变更:比如数据库服务器的时区被修改、系统时间出错,导致
getDate()返回的日期和你预期的不一致,比如今天是20号,但服务器时间显示21号,那你的查询就会查21号0点的行,自然没有数据。
正确的当天数据查询写法
你真正需要的是查询当天所有时间范围内的数据,而不是精确匹配某个时间点,推荐两种写法:
写法1:范围查询(性能最优,不破坏索引)
Select * from employee where DateTime >= dateadd(dd,0, datediff(dd,0, getDate())) AND DateTime < dateadd(dd,1, datediff(dd,0, getDate()))
这个逻辑是:查询从当天0点整开始,到第二天0点整之前的所有数据,不管行的时间部分是几点几分,只要在当天范围内都能命中。而且因为是对列做范围比较,不会破坏DateTime列的索引,性能更好。
写法2:日期类型转换(更直观,但注意索引)
Select * from employee where Convert(date, DateTime) = Convert(date, getDate())
这个是把表中的DateTime转成Date类型,和当前日期比较,写法更直观。但要注意:如果你的DateTime列有索引,这种对列做函数转换的写法会导致索引失效,数据量大的时候性能会变差,所以优先推荐第一种范围查询。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

