2015-03-24 6 views
0

DB: оракулSQL вычитать часы, минуты, секунды со дня

Есть ли способ или функции вычитать ниже двух выборочных данных и получить историческую DateTime в формате (YYyyMmDd hr24: ми: сс)?

1. Date: 20150324 13:05:22 (Date time) 
2. Time: 125:36.25 (hr:mi.ss) 

Sample expected result 

20150319 06:30:10 
+0

Каков тип данных двух столбцов? –

+0

20150324 13:05:22 (DATE) 125: 36.25 (VARCHAR2) – homer

ответ

1

Вашего образца ожидаемый результат неверен с учетом ваших же данные. Это должно быть 2015-03-19 07:28:57. Что-то вроде ниже может работать для вас:

WITH d1 AS (
    SELECT timestamp'2015-03-24 13:05:22' AS mydate 
     , '125:36.25' AS mytime FROM dual 
) 
SELECT mydate - NUMTODSINTERVAL(TO_NUMBER(SUBSTR(mytime, 1, INSTR(mytime, ':') - 1))*3600 
           + TO_NUMBER(SUBSTR(mytime, INSTR(mytime, ':') + 1, 2))*60 
           + TO_NUMBER(SUBSTR(mytime, INSTR(mytime, '.') + 1, 2)), 'SECOND') 
    FROM d1; 

Что я делаю в приведенном выше запросе является преобразование элемента «время» в секундах, а затем к INTERVAL значения вычесть из значения даты/времени.

В качестве стороннего варианта было бы лучше, если бы колонка времени была INTERVAL DAY TO SECOND вместо VARCHAR2. Затем его можно использовать непосредственно в арифметике даты/времени без необходимости просканировать любые обручи.

+0

благодарим вас за прекрасное объяснение, ожидаемый результат был только для образца типа данных, это было не совсем вычитание. – homer

0

Я хотел бы предложить преобразуя второй дробные дни и просто вычитая из первых:

select (datecol - 
     (to_number(substr(hhmmss, -2))/(60*24*24) + 
     to_number(substr(hhmmss, -5, 2))/(60*24) + 
     to_number(substr(hhmmss, instr(hhmmss, ':') - 1)/24 
     ) 
     ) 
+0

где разместить столбец времени внутри функции to_number? – homer

+0

Я назвал временной столбец 'hhmmss', потому что это формат столбца. –

Смежные вопросы