我必须做一些日期比较并返回一个数据集。 PHP发送当前日期时间,时间为非前导零(8:00:00),上午8点而不是(08:00:00)。没有前导零的情况是错误的结果。有人可以解释原因吗?
要进行测试,请运行此SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 8:00:00',"yes","No")
结果:否
AND
SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 08:00:00',"yes","No")
结果:是
不应该同时给出结果:“是”
是否对非前导零进行字符串比较?
答案 0 :(得分:3)
严格来说,您正在与字符串(不是日期)进行比较并依赖于自动投射。试试这个:
SELECT
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 8:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No'),
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 08:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No')
<强>更新强>
According to the manual,DATE_ADD()
可以返回日期或字符串:
返回值取决于 参数:
DATETIME if the first argument is a DATETIME (or TIMESTAMP) value, or if the first argument is a DATE and the unit value uses HOURS, MINUTES, or SECONDS. String otherwise.
确保结果为DATETIME, 你可以使用CAST()来转换 DATETIME的第一个参数。
因此>=
比较的左操作数是一个字符串,因此您将进行字符串比较。试试CAST('2011-03-21' AS DATE)
建议。
答案 1 :(得分:3)
我认为这与MySQL在som ecases中的相当狡猾的日期/时间处理有关,MySQL转换为数字,在其他情况下,它使用字符串比较。
来自手册
http://dev.mysql.com/doc/refman/5.0/en/using-date.html
当您使用&lt;,&lt;,=,&gt; =,&gt;或BETWEEN运算符将DATE,TIME,DATETIME或TIMESTAMP与常量字符串进行比较时,MySQL通常会将字符串转换为内部长度整数用于更快的比较(以及更多的“放松”字符串检查)。但是,此转换受以下例外情况限制:
比较两列时
将DATE,TIME,DATETIME或TIMESTAMP列与表达式
进行比较时当您使用除了刚刚列出的比较方法之外的任何其他比较方法,例如IN或STRCMP()。
对于这些特殊情况,通过将对象转换为字符串并执行字符串比较来完成比较。