尝试从 Hana 转换为 Oracle 时出现错误 ORA-30076

Error ORA-30076 when trying to translate from Hana to Oracle

提问人:Cristina Biagiotti 提问时间:6/5/2023 最后编辑:OldProgrammerCristina Biagiotti 更新时间:6/5/2023 访问量:25

问:

我正在尝试将脚本从 Hana 转换为 Oracle,但在 Rule_def 上不断收到相同的错误。第 5 行的 DATEUPD,表示该字段对提取无效。 有人可以告诉我如何在 Oracle 中正确翻译该部分吗?谢谢!

SELECT 
    P2_RULE,
    P2_ORIGIN,
    Rule_def.DATEUPD as P2_DATE,
    substr('0' || extract(hour from Rule_def.DATEUPD),2) 
    || ':' || 
    substr('0' || extract(minute from Rule_def.DATEUPD),2)
    || ':' || 
    substr('0' || extract(second from Rule_def.DATEUPD),2) AS P2_DATETIME,
    Rule_def.USERUPD || ' | ' || DESC_UTENTE as P2_USER
FROM (
    SELECT 
        P2_RULE,
        P2_ORIGIN,
        DATEUPD,
        USERUPD,
        ROW_NUMBER() over (partition by P2_RULE, p2_origin order by DATEUPD desc) as N_row
    FROM AW_PII_P20018_000001
    WHERE dateupd is not null) Rule_def
join UTENTE
ON Rule_def.USERUPD = COD_UTENTE    
WHERE N_ROW = 1

我尝试过一些日期的公式,但它们不起作用

SQL Oracle 语法错误

评论


答:

0赞 OldProgrammer 6/5/2023 #1

从 oracle 文档中,

如果请求 HOUR、MINUTE 或 SECOND,则 expr 的计算结果必须为 数据类型 TIMESTAMP、带时区的时间戳、时间戳的表达式 使用本地时区,或间隔日到秒。DATE 无效 这里,因为 Oracle Database 将其视为 ANSI DATE 数据类型,因此 没有时间字段。

因此,您需要将 DATE 字段的类型转换为 TIMESTAMP:

extract(hour from cast(Rule_def.DATEUPD as timestamp))

等,分和秒也

1赞 MT0 6/5/2023 #2

您似乎希望使用而不是复杂的格式:TO_CHARSUBSTR

SELECT r.P2_RULE,
       r.P2_ORIGIN,
       r.DATEUPD as P2_DATE,
       TO_CHAR(r.DATEUPD, 'HH24:MI:SS') AS P2_DATETIME,
       r.USERUPD || ' | ' || u.DESC_UTENTE as P2_USER
FROM   ( SELECT P2_RULE,
                P2_ORIGIN,
                DATEUPD,
                USERUPD,
                ROW_NUMBER() over (
                  partition by P2_RULE, p2_origin order by DATEUPD desc
                ) as N_row
         FROM   AW_PII_P20018_000001
         WHERE dateupd is not null
       ) r
       join UTENTE u
       ON r.USERUPD = u.COD_UTENTE    
WHERE  r.N_ROW = 1

其中,对于示例数据:

CREATE TABLE AW_PII_P20018_000001 (P2_RULE, P2_ORIGIN, DATEUPD, USERUPD) AS
SELECT 1, 2, SYSDATE, 3 FROM DUAL;

CREATE TABLE utente (desc_utente, cod_utente) AS
SELECT 'A', 3 FROM DUAL;

输出:

P2_RULE P2_ORIGIN P2_DATE P2_DATETIME P2_USER
1 2 2023-06-05 14:39:03 14:39:03 3 |一个

小提琴