2015-05-14 28 views
2

我的选择存在问题: 我有一个包含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提前

+2

日期在查询中使用时必须加引号。 –

回答

1

你在你的日期

$aFilter = ' AND c_win > "'.$date_min.'" AND c_ig.date_gain < "'.$date_max.'"'; 
+0

最佳答复。 Thx,它的工作 – TanGio

+0

@Gigel很高兴帮助.. –

+0

Downvoters请为downvoting添加一条评论 –

2

更改查询像

$aFilter = ' AND date(c_win) > '.$date_min.' AND date(c_ig.date_gain) < '.$date_max; 

日期函数返回只有像“2015年8月20日”,从“2015年8月20日21点20分20秒”

我希望日期这是为你工作。

+0

你刚刚毁掉了'c_win'或'date_gain'上的任何索引,而没有真正解决问题。 – Arth

+0

我在这样的数据库中有多个日期: '2015-01-20 21:20:20' '2015-01-20 21:20:20' 但是用我的查询我得到了空值: 'AND DATE c_ig.date_gain)> 2008-05-13 AND DATE(c_ig.date_gain)<2015-05-05' – TanGio

+0

为什么我有这种情况? – TanGio

1

尝试使用DATE()

if ($date_min != '' && $date_max != ''){ 
    $aFilter = ' AND DATE(c_win) > "' . $date_min . '" AND DATE(c_ig.date_gain) < "' . $date_max . '"'; 
} 
+0

为什么-1?!我只是在renishkhunt之后50秒:] –

+0

因为MySQL不能使用此查询的'c_win'或'c_ig.date_gain'上的索引 – Arth

+1

您如何知道该字段上有索引?问题是关于获得正确的结果,而不是关于性能问题...... –

1

需要引号不要在DATE()包裹列优化器不能在该列使用索引..加上我会绑定变量使用PDO或mysqli而不是concatting他们..

当我有日期比较在我的代码与日期输入,我几乎总是你se:

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'; 

BONUS信息

如果你想知道为什么你的查询运行,但没有给出正确的结果..

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" 

另一个很好的理由不来连接查询字符串。

+0

plus1,但是我的建议是:如果你不需要它,请不要使用'SELECT *'; –

+0

@tomrac fair point;) – Arth

相关问题