我有一个名为UPDATES的数据库表,其中插入了一些日志。在这个表中,有一个名为Time的列。此时间列为VARCHAR类型。我别无选择,只能让它成为VARCHAR,因为有些更新具有损坏的时间,比如,2013-04-04,00xcdww,有时类似于具有一些非ASCII值的2013-4-2。因此,如果列类型为DATETIME,则该日期时间的插入可能会触发一个错误。
现在,我正处于对两个日期进行比较的阶段,以获得结果的范围。
所以我的问题是,使用VARCHAR会正确地比较日期吗?
做:
Date(Time) BETWEEN 2013-03-02 AND 2013-03-02 还是会返回无效的结果?如果是这样的话,您能告诉我这个查询将返回哪些不在指定范围内的内容吗?
发布于 2014-04-09 09:54:52
是的,您需要使用日期将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 |
+-----------------------------------------------+发布于 2014-04-09 09:59:34
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'https://stackoverflow.com/questions/22958844
复制相似问题