数字到日期的转换 (Oracle)
Number to Date conversion (Oracle)
我有一个与日期匹配的数字,但我不知道如何使用该日期计算该数字,以下是三个示例:
08/08/2018 12:23 73691437391180
08/08/2018 12:32 73691437976165
11/11/2015 14:41 73591349310000
如果我从第一个减去第二个,我得到 9.74975 的差值,它对应于经过的分钟(和秒?)?
提前致谢!
PS:数据存储在Oracle数据库中。如果需要,可以生成更多示例。
有人似乎从这个梦中得到了一些乐趣。两个值之间的差异看起来确实是毫秒,但它们不是明显的纪元时间。
通过排除过程,它看起来像一个复合值,因为它不能可靠地匹配为单个值,例如除以 60*60*24 和变体。它似乎基于 0001-01-02 00:00:00 UTC 的纪元时间。
前六位数字好像是从1月2日(?)开始的天数AD/CE。尝试了几个可能的纪元日期:
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
这有点……不寻常。
对于时间戳到数字的转换,起始值也可能是一个普通的时间戳;只要您的会话在该时区,这将通过隐式转换获得相同的结果。
我有一个与日期匹配的数字,但我不知道如何使用该日期计算该数字,以下是三个示例:
08/08/2018 12:23 73691437391180
08/08/2018 12:32 73691437976165
11/11/2015 14:41 73591349310000
如果我从第一个减去第二个,我得到 9.74975 的差值,它对应于经过的分钟(和秒?)?
提前致谢!
PS:数据存储在Oracle数据库中。如果需要,可以生成更多示例。
有人似乎从这个梦中得到了一些乐趣。两个值之间的差异看起来确实是毫秒,但它们不是明显的纪元时间。
通过排除过程,它看起来像一个复合值,因为它不能可靠地匹配为单个值,例如除以 60*60*24 和变体。它似乎基于 0001-01-02 00:00:00 UTC 的纪元时间。
前六位数字好像是从1月2日(?)开始的天数AD/CE。尝试了几个可能的纪元日期:
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
这有点……不寻常。
对于时间戳到数字的转换,起始值也可能是一个普通的时间戳;只要您的会话在该时区,这将通过隐式转换获得相同的结果。