导出数据时(rclick db |任务 |生成脚本... )日期时间列按以下方式导出:
CAST(0xFFFF2E4600000000 AS DateTime)
上
select CAST(0xFFFF2E4600000000 AS DateTime)
..在SQL Server Mgmt Studio中,我得到:
1753-01-01 00:00:00.000
我需要在另一个程序中将其(即0xFFFF2E4600000000此处)转换为常规日期时间。
现在,我知道该格式如何适用于 1 年 1 月 1 日之后的日期:
first 4 bytes == the days since 1st Jan 1900
2nd 4 bytes == number of ticks since midnight (each tick is 1/300 of a second).
这有效,但我无法弄清楚上面的十六进制数 (0xFFFF2E4600000000) 如何转换为 1753-01-01。 2 的补语,1900 年至 1753 年间的各种转换等 - 没有任何效果。谷歌扔给我的搜索结果也没有帮助。请指教!
更新:
无论如何,它似乎与 2 的补码有关,请参阅以下内容,但在 Python shell 中它仍然不太有效:
>>> e=1900-1753
>>> e
147
>>>
>>> e*=365
>>> e
53655
>>> e=e-(1<<32)
>>> e
-4294913641L
>>> hex(e)
'-0xffff2e69L'
这接近0xFFFF2E46,但并不完全存在。这是怎么回事?
更新 2:
闰日?
看起来不错:
declare @Sample as DateTime = '1753-01-01'
select @Sample as 'Sample', Cast( @Sample as VarBinary(8) ) as 'VarBinary',
DateDiff( day, '1900-01-01', @Sample ) as 'DateDiff',
Cast( DateDiff( day, '1900-01-01', @Sample ) as VarBinary(4) ) as 'Hex DateDiff'
请注意,十六进制值被视为有符号的 32 位值。
如果问题是"为什么是53,690?"那么答案是:
; with Years as (
select 1753 as Year, 0 as LeapYear
union all
select Year + 1,
case
when ( Year + 1 ) % 400 = 0 then 1
when ( Year + 1 ) % 100 = 0 then 0
when ( Year + 1 ) % 4 = 0 then 1
else 0 end
from Years
where Year < 1900 )
select 147 * 365 + Sum( LeapYear ) as Days from Years
option ( maxrecursion 0 )