我有一张这样的桌子
---------------------------
|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与格式字符串
不匹配
注意:value
是VARCHAR2
字段
答案 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');
如果我是你,我会避免在列名中使用保留字。
DATE
列类型而不是VARCHAR2
来避免TO_DATE()
转换。查询速度更快,问题更少。