【问题标题】:ORA-00920: invalid relational operatorORA-00920: 无效的关系运算符
【发布时间】:2014-09-17 16:00:08
【问题描述】:

在数据库中,我试图提取晚于指定日期的信息。我应该事先注意到日期的格式很奇怪:YYYYMMDDHH24MISS## 其中## 是一个两个字母的字符串,它定义了对我的查询无用的内容。因此,我使用substr 来删除它们。

我的查询,下面,抛出以下错误,我无法找出原因:

[错误代码:920,SQL 状态:42000] ORA-00920:无效的关系 运营商

我的查询:

SELECT *
  FROM table_name
 WHERE to_date(substr(COLUMN_NAME,1,14), 'YYYYMMDDHH24MISS')) >=
       to_date('MIN_DATE', 'YYYYMMDDHH24MISS')

我已检查以确保日期定义正确,而且确实如此。

我用于MIN_DATE 的示例是:20140101000000

【问题讨论】:

  • 您的)( 的多。
  • 天哪..我在这个问题上被困了半个小时....非常感谢@JoachimIsaksson。但是,过多的括号不会有不同的错误吗??
  • 我同意应该有,但遗憾的是,Oracle 的错误消息并不总是直截了当。
  • 奇怪,我什至没有看括号。好吧,从现在开始,这将是我检查的第一件事。

标签: sql oracle


【解决方案1】:

你在第一个 to_date 的末尾有一个额外的括号

【讨论】:

    【解决方案2】:

    当您缺少比较操作(例如 =)时,您会在 Oracle 中收到此错误——正如 John Maillet 已经指出的那样。

    我关心的是where 子句的第二部分:

    where to_date(substr(COLUMN_NAME, 1, 14), 'YYYYMMDDHH24MISS') >=
                      to_date('MIN_DATE', 'YYYYMMDDHH24MISS')
    

    你有MIN_DATE 单引号。这被解释为一个包含八个字母的字符串,以'M' 开头并以'E' 结尾。这不被解释为一个变量。大概你的意思是:

    where to_date(substr(COLUMN_NAME, 1, 14), 'YYYYMMDDHH24MISS') >=
                      to_date(MIN_DATE, 'YYYYMMDDHH24MISS')
    

    您应该只对字符串和日期常量使用单引号。

    我应该补充一点,您应该能够进行此比较而无需转换为日期:

    where left(COLUMN_NAME, 14) = MIN_DATE
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 2014-03-25
      • 2020-02-07
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多