2016-06-04 7 views
0

У меня возникла проблема с преобразованием значения даты, хранящегося в поле blob в команде Oracle 11g sql. Когда я выполнить SQL:Oracle 11g Sql конвертировать дату из поля blob

select dump(HIGH_VALUE) from all_tab_columns where COLUMN_NAME='TARIH'

я получаю следующий результат;

Typ=23 Len=7: 120,116,3,6,1,1,1

Я знаю, что эти цифры представляют собой дату (не DateTime), но я не знаю, как извлечь дату из этого результата.

Спасибо заранее, ALPER

ответ

0

Oracle stores dates in tables as 7-bytes

байт 1 - век + 100
байт 2 - (год MOD 100) + 100
байт 3 - месяц
байт 4 - день
байт 5 - час + 1
байт 6 - минута + 1
байт 7 - секунд + 1

Так 120,116,3,6,1,1,1 преобразует в:

байта 1 - век = 120 - 100 = 20
байт 2 - год = 116 - 100 = 16
байт 3 - месяц = ​​3
байт 4 - день = 6
байт 5 - час = 1 - 1 = 0
байт 6 - минута = 1 - 1 = 0
байт 7 - секунд = 1 - 1 = 0

Так 2016-03-06T00:00:00

Настройка Oracle:

CREATE TABLE file_upload (file_blob BLOB); 

INSERT INTO file_upload VALUES (
    utl_raw.cast_to_raw(
    CHR(120) || CHR(116) || CHR(3) || CHR(6) || CHR(1) || CHR(1) || CHR(1) 
) 
); 

Запрос:

SELECT DUMP(DBMS_LOB.SUBSTR(file_blob, 7, 1)) AS dmp, 
     TO_DATE(
     TO_CHAR(
      (ASCII(SUBSTR(chars, 1, 1)) - 100) * 100 
      + ASCII(SUBSTR(chars, 2, 1)) - 100, 
      '0000' 
     ) 
     || TO_CHAR(ASCII(SUBSTR(chars, 3, 1)), '00') 
     || TO_CHAR(ASCII(SUBSTR(chars, 4, 1)), '00') 
     || TO_CHAR(ASCII(SUBSTR(chars, 5, 1)) - 1, '00') 
     || TO_CHAR(ASCII(SUBSTR(chars, 6, 1)) - 1, '00') 
     || TO_CHAR(ASCII(SUBSTR(chars, 7, 1)) - 1, '00'), 
     'YYYYMMDDHH24MISS' 
     ) AS converted_date 
FROM (
    SELECT file_blob, 
     UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(file_blob, 7, 1)) AS chars 
    FROM file_upload 
); 

Выход:

DMP        CONVERTED_DATE  
------------------------------- ------------------- 
Typ=23 Len=7: 120,116,3,6,1,1,1 2016-03-06 00:00:00 
+0

Точно, что я ищу, работал как шарм. Большое спасибо. –