我的选择有问题: 我有一个带有2个文本框的表单: date_min和date_max。这个日期来自控制器:
2015-05-15
现在在数据库中我的日期:c_win像这样:
2015-08-20 21:20:20
在我的查询中:
if ($date_min != '' && $date_max != ''){
$aFilter = ' AND c_win > '.$date_min.' AND c_ig.date_gain < '.$date_max;
}
但我认为我需要重新审视日期。请帮帮我!! Thx提前
答案 0 :(得分:2)
更改查询
$aFilter = ' AND date(c_win) > '.$date_min.' AND date(c_ig.date_gain) < '.$date_max;
日期功能仅返回“2015-08-20 21:20:20”中的“2015-08-20”日期
我希望这对你有用。
答案 1 :(得分:1)
尝试使用DATE()
:
if ($date_min != '' && $date_max != ''){
$aFilter = ' AND DATE(c_win) > "' . $date_min . '" AND DATE(c_ig.date_gain) < "' . $date_max . '"';
}
答案 2 :(得分:1)
您的日期需要报价
$aFilter = ' AND c_win > "'.$date_min.'" AND c_ig.date_gain < "'.$date_max.'"';
答案 3 :(得分:1)
不要将列包装在DATE()
中,因为优化器不能在列上使用索引..加上我将使用PDO或mysqli绑定变量而不是将它们连接起来..
当我在代码中使用日期输入进行日期比较时,我几乎总是使用:
SELECT ...
FROM table t
WHERE t.time >= :min_date
AND t.time < :max_date + INTERVAL 1 DAY
这完全覆盖了日期之间的所有时间而没有打破索引。 它还假设提供的日期是包容性的..这对于UI来说是合乎逻辑的。
在你的情况下,这将是:
$aFilter = ' AND c_win >= "'.$date_min.'" AND c_ig.date_gain < "'.$date_max.'" + INTERVAL 1 DAY';
奖励信息
如果您想知道为什么查询运行但没有给出正确的结果..
AND c.win > 2008-05-13 AND c_ig.date_gain < 2015-05-05
没有引号的将整数计算为:
AND c.win > 1990 AND c_ig.date_gain < 2005
然后隐式转换为:
AND c.win > "1990-01-01 00:00:00" AND c_ig.date_gain < "2005-01-01 00:00:00"
不连接查询字符串的另一个好理由。