我需要按照签收日期过滤已注册的电子邮件,但问题是制作数据库的人使签收列成为varchar(255)而不是日期戳或类似的东西。 通常我会做这样的事情:
SELECT * FROM email WHERE signoff >= DATE_SUB(NOW(), INTERVAL 1 DAY
有没有办法在不改变数据类型的情况下解决这个问题,因为数据库中已有很多数据。
答案 0 :(得分:0)
是的,这很容易:
$result = $dbhandle->query("SELECT * FROM email WHERE str_to_date(signoff, '%Y-%m-%d %H:%i:%s') >= DATE_SUB(NOW(), INTERVAL 1 DAY");
更改str_to_date中的日期格式以匹配varchar列中的日期格式。
答案 1 :(得分:0)
年有一个功能:
STR_TO_DATE('2011-12-21 02:20pm', '%Y-%m-%d %h:%i%p')
答案 2 :(得分:0)
你需要转换它。您可以像这样使用STR_TO_DATE函数:
$result = $dbhandle->query("SELECT * FROM email WHERE STR_TO_DATE(signoff , '%m/%d/%Y') >= DATE_SUB(NOW(), INTERVAL 1 DAY");
答案 3 :(得分:0)
就性能而言,将比较转换为字符串
可能更好$result = $dbhandle->query("SELECT * FROM email WHERE signoff >= CAST(DATE_SUB(NOW(), INTERVAL 1 DAY) AS CHAR(255));
但我会建议,如果可能的话,只修复专栏。
您必须执行以下步骤