我在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)尚未过期。 哪里出错了?
答案 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();
但最好的长期解决方案是不将日期存储为文本。而是使用日期类型列来显示日期信息。