SQL按日期查询无结果排查:datetime字段匹配异常
为啥你的日期查询查不到数据?
嘿,这个问题我碰到过好多次了,核心原因其实很直白——你的Dateadded是datetime类型,它不仅存了年月日,还带着时分秒(比如你的数据是2009-12-11 09:35:53.000),但你用WHERE Dateadded = '2009-12-11'查询时,数据库会自动把这个字符串转成2009-12-11 00:00:00.000,这俩时间点完全不一样,自然查不到数据啦。
为啥LIKE和格式转换没生效?
- 用
LIKE '2009-12-11%'没结果,大概率是因为数据库里datetime转成字符串后的格式和你想的不一样(比如可能是12/11/2009这种美式格式),直接按字符串前缀匹配肯定不对。 - 转换日期格式没成功,可能是你用错了转换函数,或者转换后的结果和你用来匹配的字符串格式不统一,比如转成了
11-12-2009,但你还是用2009-12-11去匹配,当然不行。
给你几个靠谱的解决方案
1. 用日期范围查询(你已经在用的有效方法)
这是最稳妥的方式,明确覆盖当天的所有时间:
SELECT Name, Dateadded FROM table WHERE Dateadded >= '2009-12-11' AND Dateadded < '2009-12-12'
这种写法比BETWEEN更严谨,不会漏掉2009-12-11 23:59:59.999之后的毫秒级数据。
2. 提取日期部分来匹配
把Dateadded转换成只含年月日的类型,再和目标日期比较,不同数据库的函数不一样,举几个常用的:
- SQL Server:
SELECT Name, Dateadded FROM table WHERE CAST(Dateadded AS DATE) = '2009-12-11' - MySQL:
SELECT Name, Dateadded FROM table WHERE DATE(Dateadded) = '2009-12-11' - Oracle:
SELECT Name, Dateadded FROM table WHERE TRUNC(Dateadded) = TO_DATE('2009-12-11', 'YYYY-MM-DD')
3. 匹配完整的时间戳
如果你明确知道要找的那条数据的完整时间,直接写全就行:
SELECT Name, Dateadded FROM table WHERE Dateadded = '2009-12-11 09:35:53.000'
不过这种方式局限性大,适合精准定位单条数据的时候用。
内容的提问来源于stack exchange,提问作者sql2015
相关产品推荐
相关产品推荐

