带有日期和时间的Oracle SQL Case when语句

时间:2020-04-17 04:54:59

标签: sql oracle

我是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

非常感谢您的帮助 谢谢。

3 个答案:

答案 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()

Demo

答案 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数据类型值,而不是例如字符串
  • 第11行:无需投放任何内容;只需在这些值上应用适当的功能
  • 第12行:在Oracle中,日期算术在起作用,因此我添加了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函数。