使用Between与列类型VARCHAR比较日期

时间:2014-04-09 09:51:15

标签: mysql

我有一个名为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 

或者这会返回无效结果吗?如果确实如此,你可以告诉我这个查询将返回的不在指定的范围内吗?

2 个答案:

答案 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'