php-mysql获取AND之间的计数


php mysql getting count WHERE BETWEEN AND

嘿,当我试图从表中获取行数时,我遇到了一个小问题,其中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);

但仍然不起作用,有什么想法吗?

谢谢。

首先,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]; 

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

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

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

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