我有一个名为UPDATES
的数据库表,其中插入了一些日志。在此表中,有一个名为 Time
的列。此时间列的类型为 VARCHAR
。我别无选择,只能让它VARCHAR
因为有损坏时间的更新,例如 2013-04-04 00xcdww,有时像 2013-4-2 一样,带有一些非 ASCII 值。因此,如果列类型为 DATETIME,则插入该日期时间可能会触发错误。
现在我正处于在两个日期之间进行比较以获得结果范围的阶段。
所以我的问题是,使用 VARCHAR 会正确比较日期吗?
行为:
Date(Time) BETWEEN 2013-03-02 AND 2013-03-02
或者这会返回无效的结果吗? 如果是这样,你能告诉我这个查询将返回什么不在指定范围内吗?
是的,您需要使用 STR_TO_DATE 将 varchar 转换为日期格式
WHERE STR_TO_DATE(Time, '%Y-%m-%d')
BETWEEN '2013-03-02' AND '2013-03-02'
mysql> select STR_TO_DATE('2013-04-04 00xcdww', '%Y-%m-%d') ;
+-----------------------------------------------+
| STR_TO_DATE('2013-04-04 00xcdww', '%Y-%m-%d') |
+-----------------------------------------------+
| 2013-04-04 |
+-----------------------------------------------+
STR_TO_DATE是不够的,你必须使用SUBSTR函数来获得前10个VARCHAR。
SELECT *
FROM `TABLE_NAME`
WHERE STR_TO_DATE(substr(`Time`,1,10), '%d/%m/%Y' )
BETWEEN '2013-03-02'
AND '2013-03-02'
这将避免您执行影响查询性能的转换。
更新由于您的数据库列可能是 2013-04-04 00xcdww,有时类似于 2013-4-2,因此您应该使用此查询,
SELECT *
FROM `TABLE_NAME`
WHERE STR_TO_DATE(`Time`, '%d/%m/%Y')
BETWEEN '2013-03-02'
AND '2013-03-02'