嘿,当我试图从表中计算行数时,我有一点问题,其中date
是BETWEEN 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);
但仍然无法运作,所以任何想法?
谢谢。
答案 0 :(得分:3)
首先,您的date
列需要是某种日期数据类型,例如DATE
或TIMESTAMP
。
其次,您需要使用有效日期进行比较。 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在下面的评论中指出的那样。