我有一个MySQL日期格式,返回旧记录

时间:2016-10-03 15:34:50

标签: php mysql

所以我有点糊涂了。我的客户选择10-01-2016($ datefrom变量)和10-02-2016($ dateto变量)。执行时,它将返回2015年和2016年的日期。

这是我的php代码:

$datefrom = $mysqli->real_escape_string($_GET['datefrom']);

$dateto = $mysqli->real_escape_string($_GET['dateto']);

$query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '$datefrom' AND '$dateto') AND date_type='1'";

当我在MySQL中运行以下查询(只是替换变量)时:

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '10-01-2016' AND '10-02-2016') AND date_type='1';

它运行并提供2015年和2016年的日期记录。

当我将DATE_FORMAT行和变量更改为以下内容时:

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN '2016-10-01' AND '2016-10-02') AND date_type='1';

运行正常,只提供2016年日期记录。

系统大约有一年的历史,LOL,因此它现在为什么会出错。如何更正SQL语法以使其正确查询而无需在使用%d-%m-%Y格式的行中更改php代码?

感谢您提供的任何帮助, 吉姆

3 个答案:

答案 0 :(得分:0)

由于您的日期不是yyyy-mm-dd格式,因此MySQL会将它们比作 STRINGS ,而非日期。

这意味着

10-23-2016 > 10-24-2015 

FALSE ,因为3在字符串比较中比4小。事实上,我们人类知道它是一个约会并且知道2016年之后是2015年之后无关紧要的事实。 MySQL不是人类,它不是AI,当它看到字符串时,它会将它们作为字符串进行比较。

如果你想做日期数学'在MySQL中,你必须使用原生格式。

答案 1 :(得分:0)

试试这个,

$datefrom = $mysqli->real_escape_string($_GET['datefrom']);

$dateto = $mysqli->real_escape_string($_GET['dateto']);

$query = "SELECT * FROM tbl_Dates WHERE date BETWEEN STR_TO_DATE('$datefrom','%m-%d-%Y') AND STR_TO_DATE('$dateto','%m-%d-%Y')) AND date_type='1'";

STR_TO_DATE会将格式化的字符串转换为日期,

DATE_FORMAT()将转换格式化的字符串表示。

答案 2 :(得分:0)

这是有效的:

$query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN STR_TO_DATE('$datefrom', '%m-%d-%Y') AND STR_TO_DATE('$dateto', '%m-%d-%Y')) AND date_type='1'";