我有一个带有日期列的表,格式为mm/dd/yyyy。
所以我试着做以下事情:
<?php
$start = '05/01/2016';
$end = '05/31/2016';
$stmt = $link->prepare('SELECT COUNT(*) date from dates WHERE user=:user AND date between '$start' AND '$end'');
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
if($stmt->execute()) {
$result = $stmt->fetchAll();
foreach($result as $row) {
if($row[0] > 0) {
echo $row[0];
}
}
}
?>
我认为问题可能是多个AND运算符。
您为用户使用占位符,这很好,但为什么不为开始和结束日期使用占位符?
我建议你使用这个:
$stmt = $link->prepare('SELECT COUNT(*) date from dates WHERE user=:user AND date between :start AND :end');
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':start', $start, PDO::PARAM_STR);
$stmt->bindParam(':end', $end, PDO::PARAM_STR);
无论如何,日期格式应该是YYYY-MM-DD
,但阅读您的注释时,您似乎使用了一个字符串来存储格式为MM/DD/YYYY
的日期。
而这个查询将返回您所期望的:
"SELECT COUNT(*) date
from dates
WHERE user=:user AND str_to_date(date, 'MM/DD/YYYY') between :start AND :end"
使用str_to_date,您可以将字符串转换为日期,并且比较会如预期的那样成功,但是我强烈建议您使用date列存储日期,您可以始终在应用程序层格式化日期。
您的问题很可能与此日期格式"2016年1月5日"有关。您使用的是葡萄牙语/巴西语格式的日期,mysql无法立即识别该日期。
尝试"2016-01-05"格式,它可能会工作