我有一个名为UPDATES
的数据库表,其中插入了一些日志。在此表中,有一个名为Time
的列。此时间列的类型为VARCHAR
。我别无选择,只能将其设为VARCHAR
,因为有更新的损坏时间,如2013-04-04 00xcdww,有时像2013-4-2,有一些非ASCII值。因此,如果Column类型为DATETIME,则该datetime的插入可能会触发错误。
现在我处于两个日期之间进行比较以获得结果范围的阶段。
所以我的问题是,使用VARCHAR会比较日期吗?
做:
Date(Time) BETWEEN 2013-03-02 AND 2013-03-02
或者这会返回无效结果吗?如果确实如此,你可以告诉我这个查询将返回的不在指定的范围内吗?
答案 0 :(得分:0)
是的,您需要使用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 |
+-----------------------------------------------+
答案 1 :(得分:0)
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'