【问题标题】:Number to Date conversion (Oracle)数字到日期转换 (Oracle)
【发布时间】:2018-08-09 16:44:20
【问题描述】:

我有一个与日期匹配的数字,但我不知道如何使用该日期计算该数字,以下是三个示例:

08/08/2018 12:23     73691437391180 
08/08/2018 12:32     73691437976165 
11/11/2015 14:41     73591349310000

如果我从第一个中减去第二个,我会得到 9.74975 的差值,它对应于经过的分钟(和秒?)?

提前致谢!

PS:数据存储在 Oracle 数据库中。如果需要,可以生成更多示例。

【问题讨论】:

    标签: oracle datetime math interpolation


    【解决方案1】:

    似乎有人在做这个梦时玩得很开心。两个值之间的差异似乎是毫秒,但它们不是明显的纪元时间。

    通过消除过程,它看起来像一个复合值,因为它不能可靠地匹配为单个值,例如除以 60*60*24 和变体。它似乎基于 0001-01-02 00:00:00 UTC 的纪元时间。

    前六位数字似乎是自公元 1 年 1 月 2 日 (?) 以来的天数。尝试了几个可能的时代日期:

    select date '2018-08-08' - date '0001-01-01' from dual;
    
    DATE'2018-08-08'-DATE'0001-01-01'
    ---------------------------------
                               736915
    

    这太接近了,不可能是巧合,但它是外出的一天,所以它显然是基于 0001-01-02 的。

    剩下的 8 位数字似乎是 UTC 午夜之后的毫秒数 - 再次假设它是从午夜开始的,但是一两个小时之后。所以还有一个时区组件,它可能有意义并且与您的个人资料位置相匹配。

    这似乎至少适用于样本值:

    with t (ts) as (
                select timestamp '2018-08-08 11:23:11.180' from dual
      union all select timestamp '2018-08-08 11:32:56.165' from dual
      union all select timestamp '2015-11-11 14:41:50.000' from dual
    )
    select ts,
      100000000 * extract(day from ts - timestamp '0001-01-02 01:00:00')
      + 3600000 * extract(hour from ts - timestamp '0001-01-02 01:00:00')
        + 60000 * extract(minute from ts - timestamp '0001-01-02 01:00:00')
         + 1000 * extract(second from ts - timestamp '0001-01-02 01:00:00') as n
    from t;
    
                 N TS                                         
    -------------- -------------------------------------------
    73691437391180 2018-08-08 12:23:11.180000000 EUROPE/VIENNA
    73691437976165 2018-08-08 12:32:56.165000000 EUROPE/VIENNA
    73591349310000 2015-11-11 14:41:50.000000000 EUROPE/VIENNA
    

    或以另一种方式转换,从时间戳而不是日期开始,因为涉及小数秒和时区:

    with t (ts) as (
                select timestamp '2018-08-08 12:23:11.180 Europe/Vienna' from dual
      union all select timestamp '2018-08-08 12:32:56.165 Europe/Vienna' from dual
      union all select timestamp '2015-11-11 14:41:50.000 Europe/Vienna' from dual
    )
    select ts,
      100000000 * extract(day from ts - timestamp '0001-01-02 00:00:00 UTC')
      + 3600000 * extract(hour from ts - timestamp '0001-01-02 00:00:00 UTC')
        + 60000 * extract(minute from ts - timestamp '0001-01-02 00:00:00 UTC')
         + 1000 * extract(second from ts - timestamp '0001-01-02 00:00:00 UTC') as n
    from t;
    
    TS                                                       N
    ------------------------------------------- --------------
    2018-08-08 12:23:11.180000000 EUROPE/VIENNA 73691437391180
    2018-08-08 12:32:56.165000000 EUROPE/VIENNA 73691437976165
    2015-11-11 14:41:50.000000000 EUROPE/VIENNA 73591349310000
    

    这有点……不寻常。

    对于时间戳到数字的转换,起始值也可能是一个普通的时间戳;只要您的会话处于该时区,这将通过隐式转换获得相同的结果。

    【讨论】:

    • 感谢分析!!这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2015-08-22
    • 2013-04-14
    相关资源
    最近更新 更多