web-dev-qa-db-ja.com

MySQLはDATE文字列をDATETIMEフィールドの文字列と比較します

質問があります:1つのDATE文字列 "2010-04-29"をDATETIME(2010-04-29 10:00)として保存されている文字列と比較することで、MySQLデータベースから選択できますか?

データをフィルタリングする日付ピッカーが1つあり、次のようにDATETIMEフィールドでテーブルをクエリしたいと思います。

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

...そして、「2010-04-29 10:00」のDATETIME値を持つ行を取得したいと思います。

助言がありますか?ありがとう。

80
Manny Calavera

以下を使用してください。

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

参考のために、200万件のレコードテーブルがあり、同様のクエリを実行しました。 Salilsの回答には4.48秒かかり、上記には2.25秒かかりました。

テーブルが大きい場合は、むしろこれをお勧めします。

140
David

DATETIME列のDATE部分が特定のリテラルと一致するすべての行を選択する場合、次のようにすることはできません。

WHERE startTime = '2010-04-29'

mySQLはDATEとDATETIMEを直接比較できないためです。 MySQLは、指定されたDATEリテラルを時間「00:00:00」で拡張します。あなたの状態は

WHERE startTime = '2010-04-29 00:00:00'

確かにあなたが望むものではありません!

条件は範囲であるため、範囲として指定する必要があります。いくつかの可能性があります。

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

最初の値が間違っている可能性がわずかにあります-DATETIME列がサブセカンド解像度を使用し、23:59:59 + epsilonで予定がある場合。一般に、2番目のバリアントを使用することをお勧めします。

どちらのバリアントも、テーブルが大きくなると重要になるstartTimeのインデックスを使用できます。

31
XL_
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

OR

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
21
Salil
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

これは、DATE_FORMAT(date,format)を使用したmysqlの日時形式用です。

1
R T
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

比較する前に、値をDATEとして変換できます。

1
Sarath