質問

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

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')

他のヒント

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

いいえ。文字列は自動的にデータタイム値にキャストされます。

見る 11.2。式評価のタイプ変換。

オペレーターがさまざまなタイプのオペランドで使用される場合、オペランドを互換性にするためにタイプ変換が発生します。いくつかの変換は暗黙的に発生します。たとえば、MySQLは必要に応じて数値を文字列に自動的に変換し、その逆も同様です。

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

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

彼らはそのためだけに機能を作るのに時間をかけたので、STR_TO_DATEを使用する方が良いと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top