2

我在 PHP 中处理 SQL Server 数据库转储时遇到问题。

我有一个名为datatime的列,其值如下:

0x0000a0af00d7f2eb

我需要在 PHP 中提取此列的日期和时间值。我没有可用的 SQL Server,所以我不能使用CAST(0x0000a0af00d7f2eb AS datetime).

有人告诉我这个十六进制:0000a0af00d7f2eb是由 4 个字节的日期和 4 个字节的时间创建的。

所以我知道:

当我将0000a0af(前 4 个字节)更改为十进制时,我将从 1900 年开始获得天数。这很好。

但是当我试图改变最后的 4 个字节(所以应该有时间):00d7f2eb到十进制时,我得到了一些我无法理解的东西。它应该是从午夜开始的时间,以毫秒为单位,有时这个值会低约 3 倍。

任何人都可以帮助转换0000a0af00d7f2eb为日期吗?我知道时间在早上 5 点到晚上 11 点之间,而这一天是上周。

4

2 回答 2

2

根据 Rene 链接的另一个问题中的链接文章,SQL Server 在第二组 4 个字节中存储 3.33 毫秒间隔,而不是毫秒。所以如果你用毫秒计算,你确实会得到大约 1/3 的时间。使用您的示例,让我们从转换为十进制开始

00d7f2eb -> 14152427 3.3ms 间隔

现在乘以 3.3 转换为毫秒,然后除以 1000 得到秒

14152427 * 3.3 / 1000 ~ 47127.58

所以这代表午夜后大约 47000 秒。一个小时除以 3600 秒

47127.58 / 3600 ~ 13.091

因此,这表示午夜后大约 13.1 小时的时间,这与 SQL Server 中的转换结果一致。

于 2012-08-20T14:45:33.887 回答
0
select CAST(0x0000a0af00d7f2eb AS datetime) as t

对我来说很好。它返回“2012 年 8 月 16 日 13:06:14-0700”。

于 2012-08-20T10:05:58.183 回答