たとえば、次のクエリは正常に機能します。
SELECT *
FROM quotes
WHERE expires_at <= '2010-10-15 10:00:00';
しかし、これは明らかに「文字列」比較を実行しています-特に「日付時刻」比較を行う関数がMySQLに組み込まれているかどうか疑問に思いました。
...これは明らかに「文字列」比較を実行しています
いいえ-日付/時刻形式がサポートされている形式と一致する場合、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')
しかし、これは明らかに「文字列」比較を実行しています
いいえ。文字列はDATETIME値に自動的にキャストされます。
11.2。式評価での型変換。 を参照してください。
異なるタイプのオペランドで演算子を使用すると、オペランドを互換にするためにタイプ変換が行われます。一部の変換は暗黙的に発生します。たとえば、MySQLは必要に応じて数値を文字列に自動的に変換し、その逆も同様です。
私はかなり古いことを知っていますが、問題に遭遇しただけで、SQLドキュメントに見たものがあります:
[日付または時刻の値でBETWEENを使用するときに最良の結果を得るには] CAST()を使用して、値を目的のデータ型に明示的に変換します。例:DATETIMEを2つのDATE値と比較する場合、DATE値をDATETIME値に変換します。 DATEとの比較で「2001-1-1」などの文字列定数を使用する場合、文字列をDATEにキャストします。
STR_TO_DATEを使用する方がよいのは、そのためだけに関数を作成するのに時間がかかり、BETWEEN docでこれを見つけたという事実もあるからです...