MySQL的timeDiff测量返回意想不到的结果

问题描述:

请考虑以下查询:MySQL的timeDiff测量返回意想不到的结果

SELECT submitted_time FROM jobs WHERE timediff(NOW(), submitted_time) < '24:00:00' 

我希望这回有包含时间戳,这是过去24小时内的“submitted_time”列中的所有行,不过我我收到了如下结果:

2017-01-18 14:58:34 
2017-01-16 14:58:34 

如果我运行查询SELECT NOW()我得到2017-01-25 18:58:32

这似乎是正确的。

什么是陌生人还是那个我在DB更近的行如:

2017-01-24 15:17:13 

正在被退回

我希望我做出了一个明显的错误,有人可以指出,而不是开始疯狂下降。

+0

您可以直接比较日期时间值和时间戳值。没有理由以这种方式做timediff。在过去的24小时内只涉及查询和使用DATE_ADD。看到这个:http://www.gizmola.com/blog/archives/51-Exploring-Mysql-CURDATE-and-NOW.-The-same-but-different..html – gview

+0

非常感谢我将采取的链接现在看看,看看我是否可以适应我的查询,不幸的是MySql不是我的强项:) – Aphire

只要是明确的,最简单和可能最高效的处理这种方式

SELECT submitted_time FROM jobs WHERE submitted_time > DATE_ADD(NOW(), INTERVAL -1 DAY); 

(根据链接我在评论中提供)这应该是所有的工作在过去的24小时内,从字面上提交在查询发布的那一刻。

对于此查询,这可能对您并不重要,但是无论何时将函数应用于表中的列,您可能拥有的任何索引都无法使用,因为数据库必须在每个值上运行函数表之前可以执行比较。

使用此方法可以计算出可比较的日期时间,并且mysql将使用submitted_time上的索引进行比较,假定该列已进行了适当索引。

+0

这很好,非常感谢。我当然会给你正确的答案,但是我会延迟几天,看看这个问题是否引出任何人提出我的查询为什么不起作用,为什么后人。 – Aphire

+0

您的原始尝试的问题在比较中。 Timediff返回一个“时间”值。 '24:00:00'是一个字符串,不是时间值。为了进行比较,您必须使用CAST('24:00:00'AS time)将字符串转换为时间值。当然这是非常混乱的,并且存在我提到的不使用索引的问题。 – gview