2010-11-09 27 views
8

Me han dado un archivo con un montón de fechas dentro. Están en formato Hex y me dicen que es YMD.Cómo convertir la fecha hexadecimal 'YMD' a una fecha legible?

Ejemplo es: 4A273F

idea ..any cómo me gustaría ir sobre su conversión? Idear usando SQL/PLSQL pero estoy abierto a otras ideas.

gracias!

+0

Son estas fechas UNIX? –

+0

¿Tiene alguna otra información sobre la codificación utilizada, o un ejemplo de valor de fecha del cual ya sabe la respuesta? – mtreit

+1

No se puede convertir sin saber lo que representa. Si es YMD, ¿cómo se divide? 4A = 74 (1974?) Como año, pero 27 = 39 que no puede ser mes. Si se trata de un número entero (4A273F = 4859711), es solo el 26 de febrero de 1970 si se trata como un fechador de época de Unix. –

Respuesta

0

Supongo que son fechas de Unix? También supongo que por SQL/PLSQL tiene acceso a SQL Server y Oracle? Si mis conjeturas son tanto de la derecha que haría uso de la función de SQL Server convertir:

select convert (int, 0x4A273F)

Además de su función de fecha agregar (empezar desde enero 1ro, 1970 y añadir segundos):

seleccione dateadd (ss, {} your_result, '19700101')

por supuesto, si todos están en archivos CSV, un guión podría hacer igual de bien. ¿Tienes más información?

+0

Acabo de publicar otra muestra arriba: 4A 3D 41 .. Estoy bastante seguro de que debería convertirse al 17 de noviembre de 2003 ¡Gracias! – Monty

+0

¿Puede dar al menos un ejemplo más (más si los tiene) para obtener una comparación, para ver qué cambios? – cag

+0

Las muestras molestas son un poco escasas pero encontré una más: 50 34 2E es el 27 de abril de 2009. ¡Gracias! – Monty

1

Oracle y Java funcionan bastante bien entre sí, y esta puede ser una nueva idea si te sientes aventurero. Java lo hace con bastante facilidad, pero estoy lejos de una caja de Oracle y no puedo probar. Esto realmente duele, no estoy frente a una máquina de oráculo en este momento. Para asegurarse de que yo no recordaba mal, solía pasos de aquí http://www.dba-oracle.com/tips_oracle_sqlj_loadjava.htm

y luego busqué en Google esto, que es casi palabra por palabra lo que haremos a continuación: 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; 
    } 
} 

guardar el archivo como Hex2Date.java en el directorio 'yourJava', y desde una línea cmd en ese tipo de directorio:

javac Hex2Date.java

tipo:

java Hex2Date.java 0x4A273F

si obtiene las fechas correctas, y los resultados, vamos a decirle a Oracle sobre nuestra pequeña función. primero necesitará algunos derechos de usuario: GRANT JAVAUSERPRIV A su usuario aquí; tipo siguiente: loadjava -user scott/tigre -resolve Hex2Date.class

ahora envolver esto en PL/SQL, por lo que se le puede llamar en 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';/

ahora, ejecutarlo desde una línea de SQL: SQL > exec DBMS_OUTPUT.PUT_LINE (hex2Date ('0x4A273F'))

+0

jaja, use esto si lo desea, pero leí el resto de las publicaciones y me di cuenta de que esto todavía tendrá un problema con el formato 'YMD'. necesitarías hackear el 'inHexString' en la función convert(). traduciendo el año, mes y día a milisegundos. – DefyGravity

0

Si los valores HEX '' son de una unidad central, entonces tal vez son EBCDIC (Extended Binary Coded código de intercambio decimal) y no ¿MALEFICIO? No tengo tiempo para razonar en este momento, pero prueba esta página para obtener ideas/pistas?http://www.simotime.com/asc2ebc1.htm Por supuesto que puede ser ladrando al árbol equivocado :)

Supóngase 50 34 2E es el 27 de de abril de 2009

EBCDIC HEX DEC 
5  F5 245 
0  F0 240 
3  F3 243 
4  F4 244 
2  F2 242 
E  C5 197 
Cuestiones relacionadas