首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请求帮助将DB2 sql转换为Oracle

请求帮助将DB2 sql转换为Oracle
EN

Stack Overflow用户
提问于 2021-07-30 21:44:25
回答 1查看 110关注 0票数 0

寻找将查询从DB2转换到Oracle的一些帮助。我正在使用一个现有的SQL来添加一个新的报表,但是该报告查询已经用DB2 SQL编写了。我正在尝试将其转换为Oracle,并对如何设置日期有问题。

代码语言:javascript
复制
  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",

正如你在上面看到的,我有一个案例陈述,它将被转换成一个时间戳,困难的部分是最后一部分,在计算时间戳之后,我需要减去-1天,这就是我不断陷入一个错误或另一个错误的地方。

为了明确起见,上述查询的其他部分只是将日期和时间连接起来,并转换为时间戳。如果能帮上忙就好了。

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

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-30 22:35:54

如果我说对了,你就会截断任何一个小时/分钟/秒/.不管怎么说,所以从一开始就忽略它吧。

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

代码语言:javascript
复制
...
to_date(trfrdate, 'YYYYMMDD') - 1 AS "NewOrderDate"
...

但是,您确实应该考虑使用适当的数据类型,而字符串类型不适合日期/时间,日期/时间类型是。例如,您可以有一个date列,而不是trfrdatetrfrtime

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68597384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档