php mysql获取计数WHERE BETWEEN和

时间:2012-09-08 21:24:00

标签: php mysql mysqli between

嘿,当我试图从表中计算行数时,我有一点问题,其中dateBETWEEN 2012-09-01 AND 2012-09-32 ...

你能告诉我问题在哪里吗?

$month = date(m);
$year = date(Y);
$day_start = '01';
$day_end = '32';

$from = $year.'-'.$month.'-'.$day_start;
$till = $year.'-'.$month.'-'.$day_end;

$result1 = $mysqli->query("SELECT COUNT(id) FROM `dreams` WHERE dream_state='dream' AND date BETWEEN $from AND $till");
$row1 = $result1->fetch_row();
$this_dream = $row1[0]; 

我试图将字符串转换为时间和时间,如下所示:

$from = strtotime($from);
$from = date("Y-m-d",$from);

$till = strtotime($till);
$till = date("Y-m-d",$till);

但仍然无法运作,所以任何想法?

谢谢。

2 个答案:

答案 0 :(得分:3)

首先,您的date列需要是某种日期数据类型,例如DATETIMESTAMP

其次,您需要使用有效日期进行比较。 9月32日不好。当MySQL试图解释该日期时,它会变为NULL。实际值和NULL之间的所有比较都是错误的。所以,你得到一个空的结果集。

第三,BETWEEN对于日期比较来说是可怕的;它通常会在距离范围内 - 最后一天 - 犯规。

我建议您使用这样的查询。请注意,第二个date比较是结束所需范围之后的那一天。

$month = date(m);
$year = date(Y);
$day_start = '01';
$from = $year.'-'.$month.'-'.$day_start;

$result1 = $mysqli->query("SELECT COUNT(id) 
                             FROM `dreams`
                            WHERE dream_state='dream' 
                              AND date >= '$from'
                              AND date < '$from' + INTERVAL 1 MONTH");
$row1 = $result1->fetch_row();
$this_dream = $row1[0]; 

答案 1 :(得分:0)

您在日期中包含破折号,但不会在SQL中将其作为字符串引用。 SQL中没有日期文字,因此您必须在输入时将日期表示为字符串。只需将它们用单引号括起来表示SQL值字符串。

$result1 = $mysqli->query("SELECT COUNT(id) FROM `dreams` WHERE dream_state='dream'
                           AND date BETWEEN '$from' AND '$till'");

您的日期也无效,因为没有月份有32天。计算每个月的最后一天似乎有点过分,所以你可能最好在描述下个月的第一天,并使用<将其排除在范围之外。

此答案的先前版本建议使用数字来描述日期而不是字符串。虽然这有效,但对于性能来说可能非常糟糕,正如@ypercube在下面的评论中指出的那样。