【问题标题】:invalid identifier with SysdateSysdate 的标识符无效
【发布时间】:2020-09-30 13:53:34
【问题描述】:

我正在尝试查询一个表并获取报告日期为上一个日期的所有记录。

select to_date(RPT_DATE,'YYYY-MM-DD') Report_Date,
from tableY
where Report_Date = Sysdate -1

但是我在 where 子句中收到一个错误,提示标识符无效。 RPT_DATE 是表中的 varchar。 格式为 yyyy-mm-dd。 如何提取前一天的所有记录?

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

    您不能在where 子句中使用列别名。此外,您还错过了sysdate 有一个时间组件。

    那么,你想要的是:

    select to_date(RPT_DATE, 'YYYY-MM-DD') as Report_Date,
    from tableY
    where trunc(to_date(RPT_DATE, 'YYYY-MM-DD')) = trunc(sysdate - 1) ;
    

    实际上,这并不是最优的,因为它会阻止在RPT_DATE 上使用索引。事实上,将RPT_DATE 存储为字符串 并不是最优的。如果将其存储为日期,您将使用:

    where RPT_DATE >= trunc(sysdate - interval '1' day) and
          RPT_DATE < trunc(sysdate)
    

    虽然这看起来有点复杂,但它可以使用RPT_DATE 上的索引——假设该列存储为日期。

    【讨论】:

    • 我在尝试时遇到了这个错误。 ORA-00932:不一致的数据类型:预期 NUMBER 得到 DATE 00932。00000 -“不一致的数据类型:预期 %s 得到 %s”。看起来 RPT_DATE 列是其数据类型 varcahar 所建议的数字。但是 sysdate 是一个日期。我需要将 case sysdate 键入一个数字吗?如果是这样,我仍然可以做一个 -1 去上一个日期吗? PS:该表由作业填充。我不确定是否可以更改数据格式。
    • 这有效“其中 trunc(to_date(RPT_DATE,'YYYY-MM-DD')) = trunc(sysdate - 1 );”但这是正确的做法吗?
    • @RLearner 。 . .是的,鉴于您的数据。但是,该列应固定为 date 数据类型。
    【解决方案2】:

    为什么不直接where rpt_date = to_char(sysdate - 1, 'yyyy-mm-dd')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多