【问题标题】:CAST HEX as DATATIME - how to get date?CAST HEX as DATETIME - 如何获取日期?
【发布时间】:2012-08-20 07:15:38
【问题描述】:

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

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

0x0000a0af00d7f2eb

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

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

所以我知道:

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

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

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

【问题讨论】:

  • 你试过选择 CAST(0x0000a0af00d7f2eb AS datetime) 吗?它给出了输出 2012-08-16 13:06:14.757,这就是你要找的吗?
  • 可能不是完整的副本,但也可能有帮助:stackoverflow.com/questions/1143259/…
  • @rene 实际上,我认为这是一个完全相同的副本:OP 需要知道 datetime 的内部表示,以便他们可以在不使用 SQL Server 的情况下进行转换

标签: php sql-server datetime casting hex


【解决方案1】:

根据 Rene 链接到的另一个问题中的linked article,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 中的转换结果一致。

【讨论】:

    【解决方案2】:
    select CAST(0x0000a0af00d7f2eb AS datetime) as t
    

    对我来说工作正常。它返回“2012 年 8 月 16 日 13:06:14-0700”。

    【讨论】:

    • 如果您没有得到此结果或期待其他结果,请提供更多信息(服务器版本或示例十六进制值和相应日期)。
    • 是的,它工作得很好,但我需要在 php 脚本上执行(我在 PHP 中有 var "CAST(0x..... AS datetime) 并且我需要获取日期。我没有'没有 mssql 服务器,所以我无法进行选择。
    猜你喜欢
    • 2013-09-28
    • 2022-12-02
    • 2014-10-08
    • 1970-01-01
    • 2012-06-12
    • 2012-10-14
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多