0

だから、多かれ少なかれ明白なはずの落とし穴に遭遇したかどうか疑問に思っています。

dateFieldでは、datetimeという名前の DB フィールドがあるとします。また、テーブル内のすべてのレコードに次の値があると仮定しましょう: 2013-10-15 13:15:46.

ここで、日付範囲内のレコードを抽出したいと考えています。yyyy-mm-ddWeb サイトのフロントエンドでは2013-10-15 ( ) 形式を使用しています。(いいえ、SQL インジェクションは不可能です。PDO を経由します。:D)

select の where ステートメントが次のように挿入されていると仮定しましょう: $select->where('dateField >= ?', $dateFrom); $select->where('dateField <= ?', $dateTo);

したがって、次のような範囲がある場合:

From: 2013-10-10 To: 2013-10-16すべて問題ありません。

しかし、次のような式では: From: 2013-10-15 To: 2013-10-15結果が表示されません! :D

MySQL が私の日付型2013-10-152013-10-15 00:00:00に内部的に変換 し、WHERE 句が次のようになると推測しています。

SELECT .... WHERE dateField <= 2013-10-15 00:00:00 AND dateField >= 2013-10-15 00:00:00;

もちろん、この場合、2013-10-15 13:15:46は WHERE 句にはありません。:D:D

の日付部分のみを比較することで、これを既に修正しました:

$select->where('DATE(dateField) >= ?', $dateFrom);
$select->where('DATE(dateField) <= ?', $dateTo);

しかし、私の質問は次のとおりです。

MySQL の内部日付/日時変換 (低レベルの操作) について誰かがもう少し説明できますか?

この質問は、コミュニティ wiki に追加するのに適していますか?

4

1 に答える 1

1

時間部分が設定されていない場合、そのような DATE を DATETIME/TIMESTAMP にキャストすると、時間部分が埋めら​​れます。00:00:00これは通常の動作です (ここで説明したように)。

2013-10-15 00:00:00それを機能させるには、時間部分を明示的に指定する必要があります2013-10-15 23:59:59

于 2013-10-15T10:52:36.750 に答える