SQL选择日期范围

时间:2016-05-03 20:20:45

标签: php mysql

我有一个日期列的表格,格式为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运算符。

2 个答案:

答案 0 :(得分:2)

您正在为用户使用占位符,这很好,但为什么您没有使用占位符作为开始日期和结束日期?

我建议你使用它:

$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列存储日期,您始终可以在应用程序层格式化日期。

答案 1 :(得分:1)

您的问题很可能是使用此日期格式'05 / 01/2016'。您使用的是葡萄牙语/巴西语格式的日期,而这些日期并未被mysql立即识别。

尝试'2016-01-05'格式,它可能会起作用