0

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

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

谢谢你。

4

2 回答 2

3

首先,您的date列需要是某种日期数据类型,例如DATEor 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]; 
于 2012-09-08T22:07:22.897 回答
0

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

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

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

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

于 2012-09-08T22:02:25.867 回答