我的数据库中有一个名为end_date的列,它是varchar而不是日期,格式为01/07/2015。我试图从今天开始抽取超过7天的行。
我尝试了以下内容。
$d = date('d/m/Y', strtotime(' -7 day')); // 7 days ago 24/06/2015
$sql = mysql_query("SELECT * FROM products WHERE end_date < '".$d."'");
或
$sql = mysql_query("SELECT * FROM products WHERE DATE_FORMAT(STR_TO_DATE(end_date, '%d/%m/%Y'), '%Y%m%d') < '".$d."'");
哪些都返回yeserday,2天前的行等,而不是只有超过7天的行。如果end_date列是varchar?
,有没有办法做到这一点答案 0 :(得分:5)
在你的where子句中试着把它放在:
WHERE str_to_date(end_date, '%d/%m/%Y') <= DATE_SUB(SYSDATE(), INTERVAL 7 DAY)
答案 1 :(得分:3)
一旦比较,varchar日期不是真实日期,它应始终采用Y-m-d
格式的形式。这里使用str_to_date
mysql> select str_to_date('01/07/2015','%d/%m/%Y') as d ;
+------------+
| d |
+------------+
| 2015-07-01 |
+------------+
返回日期为Y-m-d
格式,您可以使用mysql函数进行比较,例如date_sub()
select * from products
where
str_to_date(end_date, '%d/%m/%Y') < date_sub(curdate(),interval 7 day);
这里date_sub如何工作
mysql> select date_sub(curdate(),interval 7 day) as old_day;
+------------+
| old_day |
+------------+
| 2015-06-24 |
+------------+
1 row in set (0.00 sec)
答案 2 :(得分:-3)
您可以实现此目的的唯一方法是从数据库加载所有条目,然后迭代结果并将字符串转换为日期。之后,您可以使用您选择的日期实用程序过滤结果。
但在此之前,您应该考虑将varchar类型更改为日期类型。