没有前导零的Mysql日期比较(大于等于)

时间:2011-03-21 15:09:28

标签: php mysql

我必须做一些日期比较并返回一个数据集。 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")

结果:是

不应该同时给出结果:“是”

是否对非前导零进行字符串比较?

2 个答案:

答案 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 manualDATE_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()。

对于这些特殊情况,通过将对象转换为字符串并执行字符串比较来完成比较。