似乎有人在做这个梦时玩得很开心。两个值之间的差异似乎是毫秒,但它们不是明显的纪元时间。
通过消除过程,它看起来像一个复合值,因为它不能可靠地匹配为单个值,例如除以 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
这有点……不寻常。
对于时间戳到数字的转换,起始值也可能是一个普通的时间戳;只要您的会话处于该时区,这将通过隐式转换获得相同的结果。