2015-07-01 45 views
1

我的数据库中有一个名为end_date的列,它是一个varchar而不是日期,格式为01/07/2015。我试图从今天的日期拉行超过7天的行。MySql获取超过7天的记录(Varchar)

我试过以下。

$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

这个问题是,为什么在MySQL存储日期为varchar,而不是正确的日期/时间类型是一个坏主意,一个很好的例子。 – piotrm

+0

与问题无关请动 – user3439600

回答

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) 
-3

您可以实现此目的的唯一方法是加载数据库中的所有条目,然后迭代结果并将字符串转换为日期。之后,您可以使用您选择的日期实用程序过滤结果。

但是在你这样做之前,你应该真的考虑将varchar类型改为日期类型。

5

在您的where子句中尽量把这个:

WHERE str_to_date(end_date, '%d/%m/%Y') <= DATE_SUB(SYSDATE(), INTERVAL 7 DAY) 
+1

作品谢谢 – user3439600