Как преобразовать шестнадцатеричную дату «YMD» в читаемую дату? - PullRequest
8 голосов
/ 09 ноября 2010

Мне дали файл с кучей дат внутри.Они в шестнадцатеричном формате, и мне сказали, что это YMD.

Пример: 4A273F

... Любая идея, как я могу конвертировать его?Идеально использую SQL / PLSQL, но я открыт для других идей.

спасибо!

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Оракул и java играют довольно хорошо друг с другом, и это может быть новой идеей, если вы чувствуете себя любознательным. Java делает это довольно легко, но я далеко от оракула и не могу проверить. Это действительно больно, я не перед машиной оракула в данный момент. Чтобы убедиться, что я правильно запомнил, я использовал шаги отсюда http://www.dba -oracle.com / tips_oracle_sqlj_loadjava.htm

и затем я гуглил это, что почти дословно, что мы будем делать ниже: http://docstore.mik.ua/orelly/oracle/guide8i/ch09_03.htm

/****
*java and oracle playing together.
 */
import java.util.Date;
public class hex2Date{
   //this is if you want to call the java function from a command line outside of oracle
     public static void main (String args[]) {
         System.out.println ( convert (args[0]) );    
    }

     public static Date convert(String inHexString){
       try{
        Date dateResult = new Date(Long.parseLong(inHexString,16));
       }catch (NumberFormatException e){
       // do something with the exception if you want, recommend at least throwing it.
    //throw(e,'some extra message');

       }

        return dateResult;
   }
}

сохраните этот файл как Hex2Date.java в каталоге yourJava и из строки cmd в этом типе каталога:

javac Hex2Date.java

Теперь введите:

Java Hex2Date.java 0x4A273F

если вы получите правильные даты и результаты, давайте расскажем оракулу о нашей маленькой функции. сначала вам понадобятся некоторые права пользователя: GRANT JAVAUSERPRIV Вашему пользователю здесь; введите это: loadjava -user scott / tiger -resolve Hex2Date.class

теперь оберните это в pl / sql, так что вы можете назвать это в pl / sql.:

/* java function plsql wrapper: hex2Date.sf */ 
CREATE OR REPLACE FUNCTION hex2Date (    inHexString IN VARCHAR2)     RETURN DATE AS LANGUAGE JAVA    NAME 'Hex2Date.convert(java.lang.String)              return Date'; /

Теперь запустите его из командной строки sql: SQL> exec DBMS_OUTPUT.PUT_LINE (hex2Date ('0x4A273F')) *

0 голосов
/ 27 ноября 2010

Если значения 'HEX' взяты из мэйнфрейма, то, возможно, они представляют собой EBCDIC (расширенный двоичный код с десятичным кодом обмена), а не HEX?У меня нет времени, чтобы объяснить это прямо сейчас, но попробуйте эту страницу для идей / подсказок?http://www.simotime.com/asc2ebc1.htm Конечно, я, возможно, лаю не то дерево :)

Предположим, 50 34 2E - 27 апреля 2009

EBCDIC HEX DEC
5      F5  245
0      F0  240
3      F3  243
4      F4  244
2      F2  242
E      C5  197
0 голосов
/ 09 ноября 2010

Я предполагаю, что это даты в Unix?Я также предположил бы, что к SQL / PLSQL у вас есть доступ к SQL Server и Oracle?Если мои предположения верны, я бы использовал функцию преобразования SQL Server:

select convert (int, 0x4A273F)

, а также функцию добавления даты (начните с 1 января 1970 года и добавьтесекунд):

выберите dateadd (ss, {your_result}, '19700101')

Конечно, если все они находятся в CSV-файлах, сценарий также может сработать.У вас есть больше информации?

...