【问题标题】:Oracle between query on string field查询字符串字段之间的 Oracle
【发布时间】:2014-12-19 09:26:07
【问题描述】:

我有一张这样的桌子

---------------------------
|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: 文字与格式字符串不匹配

注意:value 是一个 VARCHAR2 字段

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    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 在下面的评论中所建议的,“如果您无法将列类型更改为 DATE,您可能应该为 TO_DATE(...) 值创建一个基于函数的索引获得更快的查询时间”

    【讨论】:

    • 如果您无法将列类型更改为日期,您可能应该为 TO_DATE(...) 值创建一个基于函数的索引以获得更快的查询时间! - 然后您可以将索引与视图一起使用 - 因此不需要额外的编码。但是将初始数据保存为 DATE 将是最好的选择
    • 感谢您的评论,@Falco!我冒昧地将其添加到我的答案中。如果您不同意,请随意回复。
    • @Falco 有时在同一列中也会出现普通字符串值
    • @Suganthan 然后你应该创建一个基于函数的索引,它为不包含有效日期的 ROW 返回 NULL。另见:stackoverflow.com/questions/5966274/…
    【解决方案2】:

    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() 转换。查询更快,问题更少。

    【讨论】:

    • 对不起。列名不是value,这只是一个测试列名。我会更新我的问题
    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2023-04-10
    相关资源
    最近更新 更多