我在用PHP处理SQL Server数据库转储时遇到问题。
我有一个名为datatime
的列,其值如下:
0x0000a0af00d7f2eb
我需要用PHP提取这一列的日期和时间值。我没有可用的SQL Server,所以我不能使用CAST(0x0000a0af00d7f2eb AS datetime)
的明显解决方案。
有人告诉我,这个十六进制:0000a0af00d7f2eb
是由4字节的日期和4字节的时间创建的。
所以我知道:
当我将0000a0af
(前4个字节)更改为十进制时,我将从1900获得天数。这很好。
但当我试图将最后4个字节(所以应该有时间):00d7f2eb
改为十进制时,我得到了一些我无法理解的东西。它应该是从午夜开始的时间(以毫秒为单位),有时这个值会低约3倍。
有人能帮我把0000a0af00d7f2eb
转换成日期吗?我知道时间是在早上5点到晚上11点之间,这一天是在上周。
根据Rene链接到的另一个问题中的链接文章,SQL Server在第二组4字节中存储3.33毫秒的间隔,而不是毫秒。因此,如果你用毫秒计算,你确实会得到大约应该是它的1/3的时间
00d7f2eb->14152427 3.3ms间隔
现在乘以3.3转换为毫秒,除以1000得到秒
14152427*3.3/1000 ~ 47127.58
因此,这代表午夜后约4.7万秒。一小时除以3600秒
47127.58/3600 ~ 13.091
因此,这表示午夜后大约13.1小时的时间,这与SQL Server中执行强制转换的结果一致。
select CAST(0x0000a0af00d7f2eb AS datetime) as t
对我来说运行良好。它返回"2012年8月16日13:06:14-0700"。