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",那么这条记录仍然会被退回.
有没有人有任何想法,我可能在这里做错了什么?
谢谢
你真的,真的不应该在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)