oracle字符串类型的时间数据进行直接比较,会隐式转换吗?
比如数据库有个栏位createtime,类型为varchar2(50),单里面的数据为时间格式的,
比如:‘2011/11/10’
查询时可以直接用一个时间字符串进行比较
select * from tb where createtime > '20111109';
是可以获取正确的结果集的,想知道这里是先讲createtiem和后面的'20111109'隐式转换转换成date类型,再比较,还是直接比较的字符串的位置ASCII?
还有就是如果栏位为date类型,进行比较应该会比varchar2类型进行比较检索效率要高吧。
比如数据库有个栏位createtime,类型为varchar2(50),单里面的数据为时间格式的,
比如:‘2011/11/10’
查询时可以直接用一个时间字符串进行比较
select * from tb where createtime > '20111109';
是可以获取正确的结果集的,想知道这里是先讲createtiem和后面的'20111109'隐式转换转换成date类型,再比较,还是直接比较的字符串的位置ASCII?
还有就是如果栏位为date类型,进行比较应该会比varchar2类型进行比较检索效率要高吧。
解决方案 »
- oracle 一个功能语句请教
- java连接oracle数据库java.sql.SQLException: 无效的列索引问题
- Linux下安装Oracle9i出现错误问题
- 希望高手能帮忙优化一下该条SQL语句!
- 大家好,oracle10g没有操作界面,用什么软件操作比较方便啊
- 愁死我了,三天没解决的小问题,请教高手执教 oracle 过程中用like后跟变量
- SQL语句求助:在分组的结果中取每组中的某一字段最大或最小的一条记录并成的结果
- 讨论:LGWR什么时候写redo log buffer 到 online redo log files?
- 如何用java应用程序调用oracle的java存储过程?
- 一条SQL求优化方案
- 表1一个字段通过表2的三个字段来 模糊匹配
- 急急急急急急 oracle 同一表中的多表查询
(1)select * from tb where createtime > '20111109'
如果想要这个条件满足的话,tb表里的createtime不能写成'2011/11/10'这种格式的,只能写成'20111110',因为'2011/11/10'不大于'20111109',只有'20111110'才大于'20111109'。
(2)比较的时候,是不会自动转换成date类型的,是挨个字符比较它的ACSII码。
所以说'2011/11/10'不大于'20111109',因为前四个字符都是2011,肯定是相等的;比到第5个字符的时候,用'/'和'1'比较,而select 1 from dual where '/' > '1'是不成立的,说明'/' 小于 '1', 所以'2011/11/10'就小于'20111109'
在两种情况下:
a.createtime varchar2(50)
b.createtime date
下面两句的执行计划是一样的:
select * from tb where createtime > '20111109';
select * from tb where createtime > to_date('20111109', 'yyyymmdd');
2. 如果建立的字段类型是Date,比较的实质是一个数值。是从一个基准开始到你的时间数据的数值。
3. 至于比较的效率,无法考证。
楼主的语句是直接当做字符串来比对的。