MySQL DateTime比較
-
10-10-2019 - |
質問
たとえば、次のクエリは正常に機能します。
SELECT *
FROM quotes
WHERE expires_at <= '2010-10-15 10:00:00';
しかし、これは明らかに「文字列」の比較を実行しています - 私は、「DateTime」の比較を特に実行するMySQLに組み込まれた関数があるかどうか疑問に思っていました。
解決
...これは明らかに「文字列」の比較を実行しています
いいえ - 日付/時刻形式がサポートされている形式と一致する場合、MySQLは暗黙的な変換を実行して、比較されている列に基づいて、値をデータタイムに変換します。同じことが起こります:
WHERE int_column = '1'
...「1」の文字列値が整数に変換される場所 int_column
のデータ型はintであり、char/varchar/テキストではありません。
文字列を明示的にデータタイムに変換したい場合、 str_to_date関数 最良の選択です:
WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')
他のヒント
しかし、これは明らかに「文字列」の比較を実行しています
いいえ。文字列は自動的にデータタイム値にキャストされます。
オペレーターがさまざまなタイプのオペランドで使用される場合、オペランドを互換性にするためにタイプ変換が発生します。いくつかの変換は暗黙的に発生します。たとえば、MySQLは必要に応じて数値を文字列に自動的に変換し、その逆も同様です。
私はそれがかなり古いことを知っていますが、私は問題に遭遇しただけで、SQLドキュメントで見たものがあります:
日付値と時刻値を使用して使用する場合の最良の結果については、CAST()を使用して、値を目的のデータ型に明示的に変換します。例:DateTimeを2つの日付値と比較する場合、日付値をDateTime値に変換します。日付と比較して「2001-1-1」などの文字列定数を使用する場合は、文字列を日付にキャストします。
彼らはそのためだけに機能を作るのに時間をかけたので、STR_TO_DATEを使用する方が良いと思います。