2011-03-21 55 views
2

我不得不做一些日期比较并返回一个数据集。 PHP发送当前日期时间,时间为非前导零(8:00:00),时间为早上8点而不是(08:00:00)。没有前导零的情况是错误的结果。有人能解释为什么吗?没有前导零的Mysql日期比较(大于等于)

要进行测试,运行此SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 8:00:00',"yes","No")

结果:没有

SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 08:00:00',"yes","No")

结果:是

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

是d oing字符串比较的一个非领先的零?

+2

您已编辑原始问题以删除对'DATE_ADD'的引用,这是实际上问题的根源,因此使问题稍有不同。 – 2011-03-21 15:38:40

+0

为道歉造成的困惑..我为了简单起见,如果你运行上面的例子,它也会失败。 – Stewie 2011-03-21 17:26:16

+0

上面的例子因为一个不同的原因失败:你永远不会对日期进行任何引用。 MySQL没有办法知道它们不应该是常规字符串。 – 2011-03-21 17:34:58

回答

3

我认为这是为了处理MySQL中相当狡猾的日期/时间处理在MySQL中转换为数字,而在其他情况下,它使用字符串比较。

从手动

http://dev.mysql.com/doc/refman/5.0/en/using-date.html

当日期,时间,DATETIME或TIMESTAMP比较恒定的串与<,< =,=,> =,>,或BETWEEN运营商, MySQL通常会将字符串转换为一个内部长整数,以便进行更快的比较(还有一点“轻松”的字符串检查)。然而,这种转换是受以下情况除外:

当你比较两列

当你比较DATE,TIME,DATETIME或TIMESTAMP列与表达式

当您使用任何其他的比较方法比刚刚列出的方法,如IN或STRCMP()。

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

+0

啊哈!正确的钱 – Stewie 2011-03-21 15:27:39

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)建议。

+0

嗯..正确,但我认为MySQL做了一个内部字符串时间转换datetime比较。还有一个问题,如果它是“date_time_field”> ='2011-03-20 8:00:00' – Stewie 2011-03-21 15:25:12

+0

谢谢,你的答案帮助.. upvoted – Stewie 2011-03-21 15:31:59

+0

事实上,我会说问题在于' ADD_DATE'。我会更新我的答案。 – 2011-03-21 15:33:28