【问题标题】:How to convert hex 'YMD' date to a readable date?如何将十六进制“YMD”日期转换为可读日期?
【发布时间】:2010-11-09 01:07:57
【问题描述】:

我收到了一个文件,里面有一堆日期。它们是十六进制格式,有人告诉我它是 YMD。

例如:4A273F

..知道我将如何转换它吗?理想情况下使用 SQL/PLSQL,但我对其他想法持开放态度。

谢谢!

【问题讨论】:

  • 您是否有任何其他关于所使用编码的信息,或者您已经知道答案的日期值示例?
  • 不知道它代表什么是无法转换的。如果是 YMD,它是如何分解的? 4A = 74(1974?)作为年份,但 27 = 39 不能是月份。如果它是一个整数 (4A273F = 4859711),如果将其视为 Unix 纪元日期戳,则它只是 1970 年 2 月 26 日。
  • 对不起..我希望它是标准格式:(
  • 另一个示例:4A 3D 41 .. 我很确定应该转换为 2003 年 11 月 17 日。希望对您有所帮助!谢谢:)

标签: sql date hex


【解决方案1】:

Oracle 和 java 可以很好地相互配合,如果您喜欢冒险,这可能是一个新想法。 Java 很容易做到这一点,但我远离 oracle 盒子并且无法测试。这真的很痛,我现在不在预言机前。为了确保我没有记错,我使用了这里的步骤 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

如果你得到了正确的日期和结果,让我们告诉 oracle 我们的小功能。 您首先需要一些用户权限: 在此处将 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'))

【讨论】:

  • 哈哈,如果你愿意,可以使用它,但我阅读了其余的帖子并意识到这仍然存在“YMD”格式的问题。您需要破解 convert() 函数中的“inHexString”。将年、月和日转换为毫秒。
【解决方案2】:

我猜它们是 unix 日期?我还猜想通过 SQL/PLSQL 您可以访问 SQL Server 和 Oracle?如果我的猜测都是正确的,我会使用 SQL Server 的转换函数:

选择转换(int,0x4A273F)

以及它的日期添加功能(从 1970 年 1 月 1 日开始并添加秒):

选择 dateadd(ss, {your_result}, '19700101')

当然,如果它们都在 csv 文件中,那么脚本也可以。你还有信息吗?

【讨论】:

  • 我刚刚在上面发布了另一个示例:4A 3D 41 .. 我很确定应该转换为 2003 年 11 月 17 日 谢谢!
  • 你能否再举一个例子(如果你有更多例子)来比较一下,看看有什么变化?
  • 令人讨厌的样本有点稀缺,但我又找到了一个:50 34 2E 是 2009 年 4 月 27 日。谢谢!
  • 如果你从 50 中减去 4A,你会得到 6,这恰好是 2003 年和 2009 年之间的差异。所以也许这一年只是将第一部分添加到 1929(或 x789)
  • 问题是其余的数字没有意义。即使将它们拼凑出来,我也无法将差异加起来。祝你好运!这些文件是否来自大型机?
【解决方案3】:

如果“HEX”值来自大型机,那么它们可能是 EBCDIC(扩展二进制编码十进制交换码)而不是 HEX?我现在没有时间推理它,但试试这个页面的想法/线索? http://www.simotime.com/asc2ebc1.htm 当然我可能找错树了:)

假设 50 34 2E 是 2009 年 4 月 27 日

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

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 2011-05-26
    • 2015-02-09
    • 2012-09-29
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多