请求帮助将 DB2 sql 转换为 Oracle

Requesting help converting DB2 sql to Oracle

寻求将查询从 DB2 转换为 Oracle 的一点帮助。我正在使用现有的 SQL 查询添加到新报告中,但该报告查询是用 DB2 SQL 编写的。我正在尝试将其转换为 Oracle,但日期的设置方式存在问题。

  trunc_timestamp(CASE ......

        ELSE ((
            CASE 
                WHEN 
                    TRFRDATE IS NULL OR
                    TRFRTIME IS NULL 
                    THEN
                        NULL
                ELSE timestamp(substr(char(TRFRDATE), 1, 4) || '-' || 
                substr(char(TRFRDATE), 5, 2) || '-' || substr(char(TRFRDATE), 7, 2)
                || '-' || substr(digits(TRFRTIME), 1, 2) || '.' || 
                substr(digits(TRFRTIME), 3, 2) || '.' || substr(digits(TRFRTIME), 5, 2)
                || '.000000')
                
            END) + (-1) DAY)
    END, 'dd') AS "NewOrderDate",

如你所见,我有一个case语句将转换为时间戳,困难的部分是最后一部分,在计算时间戳后,我需要减去-1天,这就是我的地方不断陷入一个或另一个错误。

需要说明的是,上述查询的 ELSE 部分只是连接日期和时间并转换为时间戳。任何解决这个问题的帮助都会很棒。

编辑:我现在的查询是这样的,我收到以下错误:小时必须在 1 到 12 之间

SELECT CASE 
        WHEN 
            CASE 
                WHEN 
                    CARRSERV IN ('1DYT','1PRT','SATN')
                    THEN 1
                WHEN 
                    CARRSERV IN ('2DYT','SAT2')
                    THEN 2
                ELSE 3
            END = 1 AND
            TO_CHAR(
                CASE 
                  WHEN TFRDATE IS NULL OR TFRTIME IS NULL THEN NULL
                    ELSE TO_TIMESTAMP(substr(TFRDATE, 1, 2) || '-' || substr(TFRDATE, 4, 3) || '-' || 
                      substr(TFRDATE, 8, 2) || ' ' || substr(TFRTIME, 1, 2) || '.' || 
                      substr(TFRTIME, 3, 2) || '.' || substr(TFRTIME, 5, 2))
                  END,'hh24:mi:ss') > TO_CHAR('17:00:00','hh24:mi:ss')
            THEN
                CASE 
                  WHEN TFRDATE IS NULL OR TFRTIME IS NULL THEN NULL
                    ELSE TO_TIMESTAMP(substr(TFRDATE, 1, 2) || '-' || substr(TFRDATE, 4, 3) || '-' || 
                      substr(TFRDATE, 8, 2) || ' ' || substr(TFRTIME, 1, 2) || '.' || 
                      substr(TFRTIME, 3, 2) || '.' || substr(TFRTIME, 5, 2))
                  END
            END AS NEW_DATE from table 

如果我没看错,你就是在截断任何 hour/minute/second/... 部分,所以请从头开始忽略它。

您可以简单地使用 to_date() 将字符串转换为 date:

...
to_date(trfrdate, 'YYYYMMDD') - 1 AS "NewOrderDate"
...

但是您真的应该考虑使用适当的数据类型,字符串类型不适合 date/times,date/time 类型适合。例如,您可以有一个 date 列而不是 trfrdatetrfrtime.

这是一个 CASE 表达式,而不是一个语句。 SQL 根本不知道控制流语句。