我是Oracle SQL的新手,我试图更改以下SQL Server查询以在Oracle SQL Developer中运行;
CASE WHEN DATEPART (Hour, OpenTime) < 5
THEN CONVERT(TINYINT,DATEPART(hour, OpenTime) + 24)
ELSE CONVERT(TINYINT,DATEPART(hour, OpenTime))
END
以下是我的尝试之一,但这给了我一个错误
ORA-00932:数据类型不一致:预期的NUMBER获得了CHAR
SELECT CASE
WHEN TO_CHAR(CAST(Opentime AS TIMESTAMP),'HH24') < 5
THEN TO_CHAR(CAST(Opentime AS TIMESTAMP),'HH24') + 24
ELSE TO_CHAR(CAST(Opentime AS TIMESTAMP),'HH24')
END
FROM Impos_BI_User.tbl_check
非常感谢您的帮助 谢谢。
答案 0 :(得分:1)
基本上,您希望添加24
小时,而OpenTime
列的小时部分似乎是DATETIME
类型,其值介于00
和{{ 1}}。
由于04
返回整数值,因此您使用了DATEPART(Hour, OpenTime)
(即仅整数部分),并且在Oracle DB中,< 5
转换等效于此。
让此TO_NUMBER( TO_CHAR(OpenTime,'hh24' ) )
成为子查询中的别名,以便不针对每种需要重复此转换:
hour
或者使用WITH t2 AS
(
SELECT TO_NUMBER( TO_CHAR( OpenTime,'hh24' ) ) AS hour
FROM t
)
SELECT CASE WHEN hour < 5
THEN hour + 24
ELSE hour
END AS hour
FROM t2
函数条件表达式,该表达式对于Oracle来说很特殊:
DECODE()
答案 1 :(得分:0)
我不知道MS SQL Server,所以我在猜测:如果小时数(从某个日期值中提取)小于5,则要在该日期值中加上1天(即24小时);否则,将其保留为 。
如果是这样,请参见以下示例:
SQL> with test (id, opentime) as
2 -- sample data
3 (-- ID = 1: it is 7 hours here, no changes to be made
4 select 1, to_date('18.04.2020 07:12', 'dd.mm.yyyy hh24:mi') from dual
5 union all
6 -- ID = 2: 2 hours, which means that 24 hours should be added
7 select 2, to_date('01.04.2020 02:20', 'dd.mm.yyyy hh24:mi') from dual
8 )
9 -- your query
10 select id,
11 case when to_number(to_char(opentime, 'hh24')) < 5 then
12 opentime + 1
13 else
14 opentime
15 end result
16 from test;
ID RESULT
---------- ----------------
1 18.04.2020 07:12
2 02.04.2020 02:20
SQL>
TO_DATE
函数确保这些数据确实是DATE
数据类型值,而不是例如字符串1 day
(这是您使用的24小时)。答案 2 :(得分:0)
使用extract()
!
(case when extract(hour from opentime) < 5
then extract(hour from opentime) + 24
else extract(hour from opentime)
end)
Oracle有一个perfectly good function,它返回整数小时。您应该使用它。另外,这是标准的SQL函数。