我有2天的时间,我无法解释: - )。
我有一个存储在数据库中的积分值来自DateTime.UtcNow.Ticks C#代码。我正在尝试编写一些简单的数据库查询,将它们转换回人类可读的时间,我无法正确地计算数学。
根据此文档:http://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx
“单个刻度表示一百纳秒或一千万分之一秒。在一毫秒内有10,000个刻度。 此属性的值表示自0001年1月1日午夜12:00:00起经过的100纳秒间隔的数量,表示DateTime.MinValue。它不包括可归因于闰秒的刻度数。“
因此,我希望通过以下数学方法将存储在Oracle数据库中的tick转换为日期:
取蜱并除以千万转换为秒。 取秒和除以(60 * 60 * 24)转换为天。
将天数转换为间隔,并将其添加到“0001:00,午夜,00: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日开始?两个失去的日子从何而来?
答案 0 :(得分:0)
您的勾选时间错误。如果您减去日期,您将看到您的投注时间减少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天“失去”的原因。
答案 1 :(得分:0)
虽然我无法提供那两天迷失方向的原因,但以下逻辑似乎比从0001-01-03开始任意地更有意义。
从converting .NET ticks to Obj-C Date的以下答案中可以得出逻辑,它提供了很好的解释。本质上,我们从UNIX纪元(1970-01-01)重新计算计算基础,并从那里计算滴答声。
select to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS') +
(
(TICKS_COLUMN - 621355968000000000 ) -- (now ticks - UNIX epoch in CLR ticks)
/10000000 -- CLR ticks per second
)/60/60/24 -- convert from seconds to days for date addition arithmetic
as date_from_ticks
from my_table;