Oracle - от чч мм сс до чч: мм: сс с одной экзотикой - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть Oracel DB, который содержит два столбца в формате hhmmss.Таким образом, 221000 означает 22: 10: 00.

Я хочу сделать это в правильном формате времени.Проблема в том, что существует значение 240000, которое должно быть изменено на 235959. Кроме того, ведущие нули опущены.

Кто-нибудь знает, как это сделать?

Приветствие

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Возможно, самое простое - просто преобразовать часы отдельно от минут и секунд следующим образом:

to_date(substr(t,-4),'miss') + to_number(substr(t,1,length(t)-4))/24

Ключевой факт, на который следует обратить внимание, заключается в том, что для часов> = 24 итоговая дата будетна день или более позже, чем те времена с меньшим количеством часов, поэтому вычитание преобразованных значений 230000 из 240000 приведет к разнице в один час по мере необходимости.

0 голосов
/ 12 декабря 2018

Вы можете использовать выражение case для явной обработки этого варианта использования.Для остальных вы можете преобразовать эту строку в дату, а затем отформатировать дату следующим образом:

SELECT CASE col
       WHEN '240000' THEN '23:59:59'
       ELSE TO_CHAR(TO_DATE(LPAD(col, 6, '0'), 'hh24miss'), 'hh24:mi:ss')
       ENDi
FROM   mytable
0 голосов
/ 12 декабря 2018

Допущения:

  • В вашей таблице есть столбец VARCHAR, содержащий дату в ггггммдд
  • В вашей таблице есть столбец VARCHAR или INT, в котором указано время в формате hh24miss

Что вы действительно должны сделать:

ALTER TABLE ADD proper_date DATETIME;
UPDATE table SET proper_date = TO_DATE(datecol || LPAD(timecol, 6, '0'), 'yyyymmddhh24miss');

Если в вашей таблице есть дата-время, содержащее дату, и int или varchar, содержащий время:

UPDATE table SET the_date = TO_DATE(TO_CHAR(datecol, 'yyyymmdd') || LPAD(timecol, 6, '0'), 'yyyymmddhh24miss');

Затем бросьтеразделенные столбцы - всегда ужасная идея перед лицом типа данных, предназначенных для хранения этих вещей

0 голосов
/ 12 декабря 2018

Вы можете попробовать:

select replace(to_char(t, '00,00,00'), ',', ':')

Это не относится к 24:00:00, но похоже на правильное время.Вы можете справиться с этим, используя case:

select (case when t = 240000 then '23:59:59'  -- I would use '00:00:00'
             else replace(to_char(t, '00,00,00'), ',', ':')
        end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...