【问题标题】:Requesting help converting DB2 sql to Oracle请求帮助将 DB2 sql 转换为 Oracle
【发布时间】:2021-10-06 09:04:26
【问题描述】:

寻求将查询从 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 部分只是连接日期和时间并转换为时间戳。解决这个问题的任何帮助都会很棒。

编辑:我现在的查询是这样的,我收到以下错误:hour must be between 1 and 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 

【问题讨论】:

  • 请提供样本输入和输出数据以匹配它们。基本上,您可以使用简单的cast 将日期转换为时间戳。 Oracle 中的date arithmeticmy_timestamp_field - 1 一样简单,或者更详细的my_timestamp_field - interval '1' day
  • 不幸的是,我没有样本输出。我已经向团队提出了要求,但可能要过几天才能得到。我自己无权访问 DB2 服务器,因此无法运行查询。我也无法提供 oracle 输出,因为我现在无法运行查询。
  • 我尝试了 - 间隔 '1' 天,但我一直收到此错误:“操作数的数据类型对日期时间/间隔算术无效”
  • 只要Oracle没有time的数据类型,TRFRTIME的数据类型是什么?
  • "tfrtime is string," 如果要将查询转换为 Oracle,则假定数据库也在转换。在这种情况下,您应该借此机会“更正”数据类型。 tfrtime 应该是 DATE 或 TIMESTAMP,而不是字符串。在 oracle 中,日期实际上是日期和时间,精确到秒。 TIMESTAMP 是日期和时间,精确到纳秒,并且有可能的变体来处理时区。

标签: sql oracle db2


【解决方案1】:

如果我做对了,那么无论如何你都会截断任何小时/分钟/秒/...部分,所以从一开始就忽略它。

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

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

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

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

【讨论】:

  • 谢谢。因此,我在 Case 表达式中重新编写了将日期和时间转换为时间戳的查询。我编辑了帖子以显示查询,现在我遇到了另一个错误。请看一看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2011-03-26
  • 1970-01-01
  • 2018-11-24
相关资源
最近更新 更多