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