MySQL查询:日期>日期不起作用

时间:2014-05-29 15:33:49

标签: php mysql sql date

如果可以的话,请帮助我。这是我的senario:

我有一个MySQL数据库,其中的列以varchar的形式保存日期。日期的格式为以下29/05/2014(即d / m / Y)。

我试图将此列的值与今天的日期进行比较,并返回日期早于今天日期的所有行。

我使用php变量存储今天的内容如下:

$date = date("d/m/Y");

这是我的SQL查询:

SELECT * FROM patients WHERE last_seen < '$date'

返回的内容

所以返回的内容非常不寻常(对我而言)。 last_seen&#34; day&#34;不到今天&#34; day&#34;。这似乎是在忽视月份和年份。换句话说,如果我last_seen =&#34; 30/05 / 2014&#34;今天的日期是&#34; 29/05 / 2014&#34;此记录仍然返回。

有没有人有任何想法,我可能在这里做错了什么?

由于

2 个答案:

答案 0 :(得分:5)

您确实不应该在varchar字段中存储日期 - 使用日期或日期时间或时间戳数据类型。

也就是说,有时你无法控制数据库,你必须处理别人的糟糕设计决定。在这种情况下,要比较日期,请将varchar字符串转换为日期并以这种方式进行比较。所以,在你的情况下,你可以这样:

$date = date("d/m/Y");

然后

SELECT * FROM patients WHERE str_to_date('last_seen', '%d/%m/%Y') < str_to_date('$date', '%d/%m/%Y')

或更简单

SELECT * FROM patients WHERE date(last_seen) < current_date

这样您实际上是在比较日期而不是包含日期的字符串。当然,这假设所有日期都以相同的格式存储。

编辑:我刚测试了最后一个选项 - 显然,date('30/05/2014')在我的系统上返回NULL(linux上的mysql 5.5),因此我建议最好的方法是

SELECT * FROM patients WHERE str_to_date('last_seen', '%d/%m/%Y') < current_date

答案 1 :(得分:0)

您需要将日期存储为数据库中的DATEDATETIME

然后你可以使用:

SELECT * FROM patients WHERE DATE(last_seen) < CURRENT_DATE