【问题标题】:Compare two dates in MySQL比较 MySQL 中的两个日期
【发布时间】:2018-01-31 13:17:28
【问题描述】:

我在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) 还没有过期。 错误在哪里?

【问题讨论】:

  • 列值是哪种数据类型???
  • "value" 是一个糟糕的列名。'
  • value的数据类型是varchar 200

标签: mysql sql


【解决方案1】:

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

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

【讨论】:

  • 很好地使用%Thh:mm:ss 时间...不知道这个+1。
【解决方案2】:

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

在任何情况下,您都应该使用 dates 而不是 strings 进行比较:

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

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

【讨论】:

    【解决方案3】:

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

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

    但最好的长期解决方案是不要将日期存储为文本。相反,请使用日期类型列来获取日期信息。

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2018-07-18
      • 2021-03-15
      • 2010-11-06
      • 2011-08-09
      相关资源
      最近更新 更多