MySql获取超过7天的记录(Varchar)

时间:2015-07-01 09:11:10

标签: php mysql

我的数据库中有一个名为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?

,有没有办法做到这一点

3 个答案:

答案 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类型更改为日期类型。