Oracle之间查询字符串字段

时间:2014-12-19 09:26:08

标签: sql oracle

我有一张这样的桌子

---------------------------
|id |condition_values     |
---------------------------
|1  |2012-05-12           |
|2  |2012-06-12           |
|3  |2012-07-12           |
|4  |2012-08-12           |
---------------------------

所以当我尝试查询时

select * from tableName where condition_values >= TO_DATE('2012-05-12', 'yyyy-mm-dd')
AND condition_values <= TO_DATE('2012-07-12','yyyy-mm-dd');

我收到SQL错误

  

ORA-01861:literal与格式字符串

不匹配

注意:valueVARCHAR2字段

2 个答案:

答案 0 :(得分:3)

select * from tableName where "value" >= TO_DATE('2012-05-12', 'yyyy-mm-dd') AND "value" <= TO_DATE('2012-07-12','yyyy-mm-dd');
--                             ^^^^^

根据文档(相同链接),您在此处使用implicit type conversion使用NLS日期格式:

  

将字符值与DATE值进行比较时,Oracle会将字符数据转换为DATE。


快速解决方法是写:

select * from tableName where TO_DATE("value", 'yyyy-mm-dd') >= TO_DATE('2012-05-12', 'yyyy-mm-dd') 
                           AND TO_DATE("value", 'yyyy-mm-dd') <= TO_DATE('2012-07-12','yyyy-mm-dd');

但是,由于你的日期格式与词典编纂相当,你可能会写出来:

select * from tableName where "value" >= '2012-05-12' 
                           AND "value" <= '2012-07-12';

但是,我强烈建议您修复数据,以确保为列使用正确的DATE类型。这样可以避免一堆可能的错误和问题,比如这个。

正如 Falco 在下面的评论中所建议的,&#34;如果您无法将列类型更改为DATE,您应该创建一个基于函数的索引TO_DATE(...)值以获得快速查询时间&#34;

答案 1 :(得分:1)

VALUE是保留字。更改列名称或:

select * from tableName 
where `value` >= TO_DATE('2012-05-12', 'yyyy-mm-dd')
AND value <= TO_DATE('2012-07-12','yyyy-mm-dd');

参考:Reserved Words in Oracle

如果我是你,我会避免在列名中使用保留字。


OP已更新问题。建议使用DATE列类型而不是VARCHAR2来避免TO_DATE()转换。查询速度更快,问题更少。

相关问题