【问题标题】:Oracle SQL Case when statement with dates and times带有日期和时间的 Oracle SQL Case when 语句
【发布时间】:2020-04-17 20:13:45
【问题描述】:

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

非常感谢任何帮助 谢谢。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    基本上,您希望添加24 小时,而OpenTime 列的小时部分(似乎是DATETIME 类型)的值介于0004 之间。

    由于DATEPART(Hour, OpenTime) 返回整数值,您使用了&lt; 5,即只有整数部分,在Oracle DB 中,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 
    

    或者,使用 DECODE() 函数条件表达式,专门用于 Oracle:

    WITH t2 AS
    (
    SELECT to_number( to_char(OpenTime,'hh24') ) AS hour
      FROM t
    )
    SELECT DECODE( SIGN( hour - 5 ), -1, hour + 24,  hour ) AS hour
      FROM t2 
    

    Demo

    【讨论】:

      【解决方案2】:

      我不知道 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 小时)。

      【讨论】:

        【解决方案3】:

        使用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 函数。

        【讨论】:

          猜你喜欢
          • 2011-03-22
          • 2021-02-05
          • 1970-01-01
          • 2020-01-27
          • 2016-07-08
          • 1970-01-01
          • 2015-03-28
          • 2021-01-24
          • 1970-01-01
          相关资源
          最近更新 更多