对于日期间隔为MYSQL的SQL查询不包括指定的范围?

时间:2018-10-30 07:41:27

标签: php mysql sql

我正在尝试为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的记录。我希望将其包含在内。

3 个答案:

答案 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) — 从比较中删除时间组件并仅使用日期的方法。

相关问题