web-dev-qa-db-ja.com

mysqlの日時比較

たとえば、次のクエリは正常に機能します。

SELECT * 
  FROM quotes 
 WHERE expires_at <= '2010-10-15 10:00:00';

しかし、これは明らかに「文字列」比較を実行しています-特に「日付時刻」比較を行う関数がMySQLに組み込まれているかどうか疑問に思いました。

60
GSTAR

...これは明らかに「文字列」比較を実行しています

いいえ-日付/時刻形式がサポートされている形式と一致する場合、MySQLは暗黙の変換を実行して、比較対象の列に基づいて値をDATETIMEに変換します。同じことが起こります:

WHERE int_column = '1'

...ここで、文字列値「1」はint_columnのデータ型は、CHAR/VARCHAR/TEXTではなくINTです。

文字列をDATETIMEに明示的に変換する場合は、 STR_TO_DATE関数 が最適な選択です。

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')
114
OMG Ponies

しかし、これは明らかに「文字列」比較を実行しています

いいえ。文字列はDATETIME値に自動的にキャストされます。

11.2。式評価での型変換。 を参照してください。

異なるタイプのオペランドで演算子を使用すると、オペランドを互換にするためにタイプ変換が行われます。一部の変換は暗黙的に発生します。たとえば、MySQLは必要に応じて数値を文字列に自動的に変換し、その逆も同様です。

21
Pekka 웃

私はかなり古いことを知っていますが、問題に遭遇しただけで、SQLドキュメントに見たものがあります:

[日付または時刻の値でBETWEENを使用するときに最良の結果を得るには] CAST()を使用して、値を目的のデータ型に明示的に変換します。例:DATETIMEを2つのDATE値と比較する場合、DATE値をDATETIME値に変換します。 DATEとの比較で「2001-1-1」などの文字列定数を使用する場合、文字列をDATEにキャストします。

STR_TO_DATEを使用する方がよいのは、そのためだけに関数を作成するのに時間がかかり、BETWEEN docでこれを見つけたという事実もあるからです...

0