首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与列类型VARCHAR的数据比较

与列类型VARCHAR的数据比较
EN

Stack Overflow用户
提问于 2014-04-09 09:51:15
回答 2查看 879关注 0票数 0

我有一个名为UPDATES的数据库表,其中插入了一些日志。在这个表中,有一个名为Time的列。此时间列为VARCHAR类型。我别无选择,只能让它成为VARCHAR,因为有些更新具有损坏的时间,比如,2013-04-04,00xcdww,有时类似于具有一些非ASCII值的2013-4-2。因此,如果列类型为DATETIME,则该日期时间的插入可能会触发一个错误。

现在,我正处于对两个日期进行比较的阶段,以获得结果的范围。

所以我的问题是,使用VARCHAR会正确地比较日期吗?

做:

代码语言:javascript
复制
Date(Time) BETWEEN 2013-03-02 AND 2013-03-02 

还是会返回无效的结果?如果是这样的话,您能告诉我这个查询将返回哪些不在指定范围内的内容吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-09 09:54:52

是的,您需要使用日期将varchar格式转换为日期格式

代码语言:javascript
复制
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                                    |
+-----------------------------------------------+
票数 0
EN

Stack Overflow用户

发布于 2014-04-09 09:59:34

STR_TO_DATE是不够的,您必须使用SUBSTR函数才能获得第一个10 VARCHAR

代码语言:javascript
复制
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,所以您应该使用这个查询,

代码语言:javascript
复制
SELECT * 
FROM  `TABLE_NAME` 
WHERE STR_TO_DATE(`Time`, '%d/%m/%Y') 
BETWEEN  '2013-03-02'
AND  '2013-03-02'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22958844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档