Sql where 子句中的日期比较未按预期工作

Sql date comparison in where clause is not working as expected

我遇到了一种奇怪的 mysql 行为...

如果我想return "MyTable" 中日期早于 10 秒前或未来日期的行 我还存储了未来的日期,因为在我的真实程序中,我 "launch" 一些有延迟的查询,日期实际上是最后一个查询日期...即:一种队列...:

SELECT (NOW() - date) AS new_delay, id 
FROM MyTable 
WHERE (NOW() - date < 10) 
ORDER BY new_delay DESC;

这个没有按预期工作:它return所有条目

编辑:结果如下:

但是,这个工作正常:

SELECT (NOW() - date) AS new_delay, id 
FROM MyTable 
WHERE (NOW() < date + 10) 
ORDER BY new_delay DESC;

数据库示例:

CREATE TABLE IF NOT EXISTS `MyTable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


INSERT INTO `MyTable` (`id`, `date`) VALUES
(1, (NOW())),
(2, (NOW()-10)),
(3, (NOW()+100));

有什么想法吗??

使用mysqlDATEDIFF

select DATEDIFF(curdate(),date) as new_delay, id from MyTable 
where date >= date_sub(curdate(), interval 10 day)
ORDER BY new_delay DESC;

DATEDIFF() function returns the time between two dates

不要这样比较。在数字上下文中,now() 最终被转换为整数——并且是一种神秘的格式。相反,使用 DATEDIFF() 或只是常规比较。例如,如果您想要天数差异:

SELECT datediff(curdate(), date) as new_delay, id
FROM MyTable
WHERE date >= date_sub(now(), interval 10 day) 
ORDER BY new_delay DESC;

正如@Gordon 在他的回答中所建议的那样,我可以使用 date_sub / date_add 函数...

我可以将 where 子句更正为:

WHERE NOW() < date_add(ServerRequests.date, interval 10 second) 

WHERE date > date_sub(now(), interval 10 second) 

或如我最初post中所提议:

WHERE (NOW() < date + 10) 

但是我还是不明白为什么我不能使用子操作...所以如果有人能给我一个理由,我很乐意理解...