Oracle SQL Случай, когда выписка с датой и временем - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в Oracle SQL и пытаюсь изменить следующий SQL Запрос к серверу для запуска в 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 ]

1 голос
/ 17 апреля 2020

Как правило, вы хотите добавить 24 часов, в то время как часовая часть столбца OpenTime, который, кажется, имеет тип DATETIME, имеет значения от 00 до 04.

Поскольку DATEPART(Hour, OpenTime) возвращает целочисленное значение, вы использовали < 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() Условное выражение spesifi c до 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 

Демо

0 голосов
/ 17 апреля 2020

Использование extract()!

(case when extract(hour from opentime) < 5
      then extract(hour from opentime) + 24
      else extract(hour from opentime)
 end)

Oracle имеет отлично работающую функцию , которая возвращает целое число часов. Вы должны использовать это. Как плюс, это стандартная функция SQL.

0 голосов
/ 17 апреля 2020

Я не знаю MS SQL Сервер, поэтому я догадываюсь: если часы (извлеченные из некоторого значения даты) меньше 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, арифметика даты c работает в дни , поэтому я добавил 1 day (что вы использовали 24 часа) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...