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)
但是我还是不明白为什么我不能使用子操作...所以如果有人能给我一个理由,我很乐意理解...
我遇到了一种奇怪的 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)
但是我还是不明白为什么我不能使用子操作...所以如果有人能给我一个理由,我很乐意理解...