0

テーブルから行数を取得しようとすると、少し問題が発生します。ここ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);

しかし、それでも機能しないので、何かアイデアはありますか?

ありがとうございました。

4

2 に答える 2

3

まず、date列はまたはのようなある種の日付データ型である必要がありDATEますTIMESTAMP

次に、比較のために有効な日付を使用する必要があります。9月32日はダメです。MySQLがその日付を解釈しようとすると、NULLになります。実際の値とNULLの間のすべての比較はfalseになります。したがって、空の結果セットが得られます。

第三に、BETWEEN日付の比較にはひどいです; それはしばしば範囲の終わり、つまり最終日を汚します。

このようなクエリを使用することをお勧めします。dateとの2番目の比較は、目的の範囲の終了の翌日であることに注意してください。

$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 に答える