寻找将查询从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",正如你在上面看到的,我有一个案例陈述,它将被转换成一个时间戳,困难的部分是最后一部分,在计算时间戳之后,我需要减去-1天,这就是我不断陷入一个错误或另一个错误的地方。
为了明确起见,上述查询的其他部分只是将日期和时间连接起来,并转换为时间戳。如果能帮上忙就好了。
编辑:我现在的查询是这样的,我得到了以下错误:小时必须在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 发布于 2021-07-30 22:35:54
如果我说对了,你就会截断任何一个小时/分钟/秒/.不管怎么说,所以从一开始就忽略它吧。
您可以简单地使用to_date()将字符串转换为date
...
to_date(trfrdate, 'YYYYMMDD') - 1 AS "NewOrderDate"
...但是,您确实应该考虑使用适当的数据类型,而字符串类型不适合日期/时间,日期/时间类型是。例如,您可以有一个date列,而不是trfrdate和trfrtime。
这是一个CASE 表达式,不是语句。SQL根本不知道控制流语句。
https://stackoverflow.com/questions/68597384
复制相似问题