Php 从数据库中选择日期时间

Php 从数据库中选择日期时间,php,mysql,sql,php-5.3,Php,Mysql,Sql,Php 5.3,我的选择有问题: 我有一个带有两个文本框的表单: 日期\最小值和日期\最大值。此日期在控制器中: 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_ma

我的选择有问题: 我有一个带有两个文本框的表单: 日期\最小值和日期\最大值。此日期在控制器中:

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;
    }
if($date\u min!=''&$date\u max!=''){
$aFilter='和c_赢>'。$date_最小值。'c_ig.date_增益<'。$date_最大值;
}
但我想我需要重新修改日期。请帮帮我!!提前Thx

更改查询,如

 $aFilter = ' AND date(c_win) > '.$date_min.' AND date(c_ig.date_gain) < '.$date_max;
$aFilter='和日期(c_win)>'.$date_min.'和日期(c_ig.date_增益)<'.$date_max;
日期函数仅返回日期,如“2015-08-20 21:20:20”中的“2015-08-20”

我希望这对您有用。

尝试使用
DATE()

if($date\u min!=''&$date\u max!=''){
$aFilter='和日期(CU win)>“.$DATE\U min.”和日期(CU ig DATE\U gain)<“.$DATE\U max.”;
}

您需要在日期周围加上引号

$aFilter = ' AND c_win > "'.$date_min.'" AND c_ig.date_gain < "'.$date_max.'"';
$aFilter='和c_win>“.$date_min.”和c_ig.date_gain<“.$date_max.”;

不要将列包装在
DATE()
中,因为优化器无法在列上使用索引。。另外,我将使用PDO或mysqli绑定变量,而不是将它们合并

当我在代码中使用日期输入进行日期比较时,我几乎总是使用:

SELECT ...
  FROM table t
 WHERE t.time >= :min_date
   AND t.time <  :max_date + INTERVAL 1 DAY
选择。。。
来自表t
其中t.time>=:min\u日期
和t.时间<:最大日期+间隔1天
它准确地覆盖了日期之间的所有时间,而不破坏索引。 它还假设提供的日期是包含在内的。。这对于UI来说是合乎逻辑的

在您的情况下,这将是:

$aFilter = ' AND c_win >= "'.$date_min.'" AND c_ig.date_gain < "'.$date_max.'" + INTERVAL 1 DAY';
$aFilter='和c_win>=''.$date\u min.''和c_ig.date\u增益<''.$date\u max.''“+间隔1天”;
奖金信息

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

AND c.win > 2008-05-13 AND c_ig.date_gain < 2015-05-05 
和c.win>2008-05-13和c\u ig.date\u增益<2015-05-05
不带引号的情况下,计算结果为整数:

AND c.win > 1990 AND c_ig.date_gain < 2005
和c.win>1990和c_ig.date_增益<2005
然后隐式转换为:

AND c.win > "1990-01-01 00:00:00" AND c_ig.date_gain < "2005-01-01 00:00:00"
和c.win>“1990-01-01 00:00:00”和c\u ig.date\u增益<“2005-01-01 00:00:00”

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

在查询中使用时,日期必须是引号。而且您刚刚破坏了
c_-win
date_-gain
上的任何索引,但实际上并没有解决问题。我在数据库中有多个日期,如下所示:
2015-01-20 21:20
2015-01-20 21:20
查询我得到空值:
和日期(c_ig.DATE_gain)>2008-05-13和日期(c_ig.DATE_gain)<2015-05-05
我为什么会出现这种情况?2015-01-20 21:20:20日期不在2008-05-13到2015-05-05之间,所以您得到了空值。为什么-1?!我在renishkhunt之后才50秒:]因为MySQL不能在这个查询中使用
c_-win
c_-ig.date\u-gain
上的索引你怎么知道这个字段上有索引?问题是如何得到正确的结果,而不是性能问题……我不知道,但允许使用索引的查询也同样简单。。所以我不能推荐这个。基于日期的比较最好采用一致的方法。我同意使用
date()
不能使用索引,因为只有像
这样的运算符才能转换为
DATETIME
。如果您使用的是索引(您应该;),请避免使用
DATE()
。如果不是,只是想要一个快速的解决方案,那么
DATE()
将再次提供帮助。这将把列包装在日期函数中,使得任何索引都不可用。。同样的原因,我否决了其他答案。加1,但我的建议是:如果不需要,不要使用
SELECT*
AND c.win > "1990-01-01 00:00:00" AND c_ig.date_gain < "2005-01-01 00:00:00"