我正在尝试为MYSQL创建一条SQL语句以检索介于日期范围之间的记录。我希望记录返回,其中包括指定范围的两个日期。目前还没有发生。有人可以请教吗?
我的SQL-PHP:
$fromDate = '21-SEP-2018';
$toDate = '29-SEP-2018';
$sql = "SELECT * FROM myTable WHERE zapDocUserId='$USER_ID' AND dateUpload BETWEEN \"$fromDate\" AND \"$toDate\" ORDER BY dateUpload DESC";
$result = $mysqli -> query($sql);
我返回的记录不包括日期为21-SEP-2018和29-SEP-2018的记录。我希望将其包含在内。
答案 0 :(得分:2)
您的日期文字在MySQL(或许多其他SQL版本)中无效。如果您使用有效的格式,查询应该可以工作。另外,您实际上应该在PHP代码中使用准备好的语句。考虑到这两个因素,以下方法应该起作用:
$fromDate = '2018-09-21';
$toDate = '2018-09-29';
$sql = "SELECT * FROM myTable WHERE zapDocUserId = ? AND dateUpload BETWEEN ? AND ? ";
$sql .= "ORDER BY dateUpload DESC";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('iss', $USER_ID, $fromDate, $toDate);
$stmt->execute();
这假定您的dateUpload
列是正确的日期类型列。如果dateUpload
实际上是 text ,并且您将日期存储为例如21-SEP-2018
,那么您还必须致电STR_TO_DATE
来转换表中的日期:
$sql = "SELECT * FROM myTable WHERE zapDocUserId = ? AND ";
$sql .= "STR_TO_DATE(dateUpload, '%d-%b-%Y') BETWEEN ? AND ? ";
$sql .= "ORDER BY dateUpload DESC";
See here了解有关MySQL日期和时间文字的规则的更多信息。
答案 1 :(得分:2)
请勿使用between
作为日期。问题是时间部分。亚伦·伯特兰(Aaron Bertrand)拥有一个不错的博客(What do BETWEEN and the devil have in common?)。尽管适用于SQL Server,但它适用于任何数据库。
您似乎想要:
SELECT *
FROM myTable
WHERE zapDocUserId = '$USER_ID' AND
dateUpload >= '$fromDate' AND
dateUpload < '$toDate' + interval 1 day
ORDER BY dateUpload DESC;
当然,这不能解决您的日期格式。那是另一回事。但是,您不应该只修复日期格式。您应该学习如何将参数传递到查询中,以便查询从一开始就获得正确的类型。使用占位符,查询将更像:
SELECT *
FROM myTable
WHERE zapDocUserId = ? AND
dateUpload >= ? AND
dateUpload < ? + interval 1 day
ORDER BY dateUpload DESC;
答案 2 :(得分:0)
解决问题的一个非常简单的方法是使用 CAST(<field> AS DATE)
子句。这将从查询中删除计时组件:
$fromDate = '2018-09-21';
$toDate = '2018-09-29';
$sql = "SELECT * FROM myTable WHERE zapDocUserId = ? AND CAST(dateUpload AS DATE) BETWEEN ? AND ? ";
$sql .= "ORDER BY dateUpload DESC";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('iss', $USER_ID, $fromDate, $toDate);
$stmt->execute();
在此示例中 CAST(dateUpload AS DATE)
— 从比较中删除时间组件并仅使用日期的方法。