所以我有点糊涂了。我的客户选择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代码?
感谢您提供的任何帮助, 吉姆
答案 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'";