シッダールタ:
私は唯一のDateTime varchar型のISO形式のようにそこに保存されているテーブルを持っています。私はテーブルに格納されている(VARCHAR中)のDateTimeとISO形式の任意のランダムなのDateTime与え比較するMySQLのクエリどうなるか知りたいと思いました。
パトリックAllaert:
SELECT
STR_TO_DATE('2020-01-03 17:35:48', GET_FORMAT(DATETIME,'ISO')) <
STR_TO_DATE('2020-02-01 00:00:00', GET_FORMAT(DATETIME,'ISO'));
GET_FORMAT(DATETIME,'ISO')
似ている:%Y-%m-%d %H:%i:%s
、あなたも行うことができます。
SELECT
STR_TO_DATE('2020-01-03 17:35:48', '%Y-%m-%d %H:%i:%s') <
STR_TO_DATE('2020-02-01 00:00:00', '%Y-%m-%d %H:%i:%s');
あなたがしたらDateTime
、あなたはすべての演算子を使用してそれらを比較することができます:=
、<
、<=
、>
、>=
、!=
、BETWEEN
、...
注:日付/時刻格納するために避けVARCHAR
列を、理由は次のとおりです。
- あなたは、インデックスを利用することはできません
STR_TO_DATE(mydate)
あなたのテーブルのすべての行に対して実行する必要がありますし、全表スキャンが発生します。インデックスが含まれますmydate
、結果のではなく、STR_TO_DATE(mydate)
それは使用されませんを意味し、。 - この意志:
- クエリのすべての複雑さを増します。
- あなたのテーブルで使用されるスペースの量を増やします。
- データベースの全般的なパフォーマンスを傷つけます。
別の方法としては、ISO形式がASCII比較を使用してソートすることができるという事実から、日付と利益への変換を回避することです。あなたの特定のケースでは、あなたが行うことができます:
SELECT *
FROM TABLE
WHERE traceTime < '2020-02-21T08:40:07.749060'
しかし、それでもまだ、あれば良いでしょうTRACETIMEがタイプであったDATETIME
、クエリがちょうど同じになります。