请求帮助将 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
列而不是 trfrdate
和 trfrtime
.
这是一个 CASE
表达式,而不是一个语句。 SQL 根本不知道控制流语句。
寻求将查询从 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
列而不是 trfrdate
和 trfrtime
.
这是一个 CASE
表达式,而不是一个语句。 SQL 根本不知道控制流语句。