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

ric*_*h_c -1 php mysql sql date

嗨,如果可以,请帮助我.这是我的晚会:

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

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

我正在使用php变量存储今天如下:

$date = date("d/m/Y");
Run Code Online (Sandbox Code Playgroud)

这是我的SQL查询:

SELECT * FROM patients WHERE last_seen < '$date'
Run Code Online (Sandbox Code Playgroud)

什么回来了

所以返回的内容非常不寻常(对我而言).last_seen"day"小于今天"day"的所有记录.这似乎是在忽视月份和年份.换句话说,如果我last_seen ="30/05/2014",今天的日期是"29/05/2014",那么这条记录仍然会被退回.

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

谢谢

Ale*_*s G 5

你真的,真的不应该在varchar字段中存储日期 - 使用日期或日期时间或时间戳数据类型.

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

$date = date("d/m/Y");
Run Code Online (Sandbox Code Playgroud)

然后

SELECT * FROM patients WHERE str_to_date('last_seen', '%d/%m/%Y') < str_to_date('$date', '%d/%m/%Y')
Run Code Online (Sandbox Code Playgroud)

或者更简单

SELECT * FROM patients WHERE date(last_seen) < current_date
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM patients WHERE str_to_date('last_seen', '%d/%m/%Y') < current_date
Run Code Online (Sandbox Code Playgroud)