SQL选择日期范围


SQL selecting date range

我有一个带有日期列的表,格式为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"格式,它可能会工作