日期数学在与.NET Ticks相关的Oracle中
我有2天的时间,我无法解释:-)。
我在C#代码中存储了来自DateTime.UtcNow.Ticks的数据库中的整数值。 我正在尝试写一些简单的数据库查询来将这些查询转换回人类可读的时间,并且我无法正确地计算数学。
根据此文档:http://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx
“单个刻度代表一百纳秒或百万分之一秒,一毫秒内有一万个刻度,这个属性的值表示从一月中午12:00点开始经过的100纳秒间隔的数量1,0001代表DateTime.MinValue。它不包括可归于闰秒的滴答数。“
因此,我期望通过以下数学方法将存储在Oracle数据库中的ticks转换为日期:
以蜱和千万分之一转换为秒。 以秒为单位并除以(60 * 60 * 24)转换为天数。
将天数转换为间隔并将其添加到“0001年1月1日午夜12:00:00”以获得最终日期。
在我的测试中,我使用了621355968000000000作为滴答的值,它对应于Unix纪元时间。
这是我想出的问题:
select to_char(to_date('0001-01-01','YYYY-MM-DD') + numtodsinterval(621355968000000000/(10000000*60*60*24),'DAY'), 'DD-Mon-YYYY HH24:MI:SS') as now from dual
但是,这将返回一个在Unix纪元时间前2天的结果。 这个查询返回我想要的结果:
select to_char(to_date('0001-01-03','YYYY-MM-DD') + numtodsinterval(621355968000000000/(10000000*60*60*24),'DAY'), 'DD-Mon-YYYY HH24:MI:SS') as now from dual
所以我不明白为什么我需要从1月3日开始,而不是1月1日? 两个失去的日子从哪里来?
你的滴答时间是错误的。 如果你减去日期,你会发现你的报时时间正在减少2天。
select (621355968000000000 / (10000000 * 60 * 60 * 24)) from dual;
结果日期:719162
select TO_DATE('1970-01-01', 'YYYY-MM-DD') - TO_DATE('0001-01-01', 'YYYY-MM-DD') from dual;
结果日期:719164
这是2个“丢失”日子的原因。
链接地址: http://www.djcxy.com/p/18533.html上一篇: Date Math In Oracle related to .NET Ticks
下一篇: What is the precise definition of JDE's Julian Date format?