sql查询mysql的日期之间是否不包含指定的范围?

tquggr8v  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(496)

我正在尝试为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);

我收到的记录不包括日期为2018年9月21日和2018年9月29日的记录。我想包括在内。

mw3dktmi

mw3dktmi1#

不要使用 between 日期。问题是时间成分。关于这一点,亚伦·伯特兰有一个很好的博客(你和魔鬼有什么共同点?)。尽管面向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;
ecbunoof

ecbunoof2#

您的日期文本在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 实际上是文本,并且您将日期存储为。 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";

请参阅此处阅读有关mysql日期和时间文本规则的更多信息。

相关问题