比较MySQL中的两个日期

时间:2018-01-31 13:17:29

标签: mysql sql

我在mysql数据库中有记录,每条记录都有过期日期 所以我想从我的数据库中选择过期的记录 这是我桌子的内容:

+-------------+-------------+----------------------+
| username    | attribute   | value                |
+-------------+-------------+----------------------+
| ali         | Expiration  | 22 Jan 2018 01:01:30 |
| jon         | Expiration  | 10 Jan 2018 02:02:55 |
| goerge      | Expiration  | 22 Feb 2018 12:03    |    
+-------------+-------------+----------------------+

如您所见,我有2个过期帐户 当我尝试选择这些过期的记录时,我有NULL个结果。

这是我的查询:

SELECT *
FROM radcheck
WHERE DATE_FORMAT(STR_TO_DATE(e.value, '%d %M %y'), '%d %M %y')
  <= DATE_FORMAT(NOW(), '%d %M %y');

但查询结果显示此记录

+-------------+-------------+----------------------+
| username    | attribute   | value                |
+-------------+-------------+----------------------+
| ali         | Expiration  | 22 Jan 2018 01:01:30 |
| jon         | Expiration  | 10 Jan 2018 02:02:55 |
| goerge      | Expiration  | 22 Feb 2018 12:03    |
+-------------+-------------+----------------------+

即使第二条记录(jon)尚未过期。 哪里出错了?

3 个答案:

答案 0 :(得分:1)

您应该在适当的日期转换字符串并获取日期部分

select * from radcheck 
where  date(STR_TO_DATE(e.value, '%d %b %y %T'))  <= curdate()

答案 1 :(得分:0)

您应修复数据结构,以便将日期存储为日期。在键值存储中,您应该使用标准的日期/时间格式,以便随时转换它们。

在任何情况下,您都应该使用日期而非字符串进行比较:

select *
from radcheck
where str_to_date(e.value, '%d %M %y') <= curdate();

请注意,这使用curdate()而不是now()。我怀疑当前的时间是你需要考虑的事情。

答案 2 :(得分:0)

您应该使用完整格式字符串调用STR_TO_DATE

SELECT *
FROM radcheck
WHERE STR_TO_DATE(value, '%d %b %y %h:%i:%s') <= CURDATE();

但最好的长期解决方案是不将日期存储为文本。而是使用日期类型列来显示日期信息。

Demo