MySQL中datetime列与字符串比较的有效性技术咨询
关于MySQL中Datetime列与字符串比较的问题
嘿,这个问题我碰到过好多次了,来给你唠唠清楚~
首先明确告诉你:在MySQL里,你测试的那种写法(用标准格式的字符串和datetime列直接比较)是完全可行的,你自己的测试结果没问题!
为什么可行?
MySQL会自动做「隐式类型转换」——当你把符合MySQL datetime格式的字符串(比如yyyy-mm-dd或者yyyy-mm-dd hh:mm:ss)和datetime类型的列进行比较时,它会自动把字符串转换成datetime类型,再和列的值做对比。比如你写:
SELECT id FROM your_table WHERE started_date > '2017-06-01';
MySQL会把'2017-06-01'自动解析成2017-06-01 00:00:00,然后和started_date的值比较,结果完全符合预期。
为什么有人说「不能这么做」?
这其实是出于两个方面的顾虑:
- 格式错误风险:如果你的字符串格式不符合MySQL的要求(比如写成
06/01/2017或者2017-6-1这种不标准的格式),MySQL的隐式转换可能会出错,返回错误的结果甚至直接报错。 - 性能隐患(极端情况):虽然像
started_date > '2017-06-01'这种写法不会影响索引使用(因为是把字符串转成datetime,列本身不用转换),但如果是反过来的错误写法(比如用函数转换列的值再和字符串比较,比如DATE(started_date) > '2017-06-01'),会导致索引失效,查询变慢。可能有人把这种情况和正常的字符串比较混淆了,才会说「不能比较」。
更稳妥的写法推荐
为了避免踩坑,同时让代码更清晰,推荐两种写法:
- 写法1:使用完整的标准格式字符串
明确写出时间部分,可读性更强:SELECT id FROM your_table WHERE started_date > '2017-06-01 00:00:00'; - 写法2:显式转换字符串
用STR_TO_DATE函数把字符串转换成datetime类型,强制指定格式,彻底避免格式错误:SELECT id FROM your_table WHERE started_date > STR_TO_DATE('2017-06-01', '%Y-%m-%d');
总结
你的测试写法是有效的,但要保证字符串格式正确。如果想要代码更健壮、可读性更高,优先考虑上面推荐的两种写法哦~
内容的提问来源于stack exchange,提问作者Xiaoxi Chen
相关产品推荐
相关产品推荐

