所以我有点困惑。我的客户选择 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 年日期记录。
该系统已经使用了大约一年,哈哈,这就是为什么它现在给出错误的原因。如何更正 SQL 语法以使其正确查询,而无需更改使用 %d-%m-%Y 格式的 php 代码?
感谢你们提供的任何帮助, 吉姆
最佳答案
由于您的日期不是yyyy-mm-dd
格式,MySQL 会将它们作为STRINGS 进行比较,而不是日期。
这意味着
10-23-2016 > 10-24-2015
为FALSE,因为在字符串比较中3
比4
小。我们人类知道这是一个日期并且知道 2016 年在 2015 年之后,这一事实无关紧要。 MySQL 不是人类,它不是人工智能,当它看到字符串时,它会将它们作为字符串进行比较。
如果您想在 MySQL 中进行“日期数学”,那么您必须使用 native 格式。
关于php - 我有一个返回旧记录的 MySQL 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39835287/