【问题标题】:Microsoft Hex dates微软十六进制日期
【发布时间】:2011-11-26 16:46:18
【问题描述】:

我从 Microsoft SQL Server 数据库获取以下日期/时间值:

0x00009CEF00A25634

我发现了这个帖子: Help me translate long value, expressed in hex, back in to a date/time

这似乎是在正确的轨道上,但是通过使用我没有得到正确日期的代码,我的十六进制日期是不同的格式吗?我如何将它们转换为正常日期,我使用的是 PHP/PostgreSQL。

【问题讨论】:

    标签: postgresql datetime type-conversion


    【解决方案1】:

    这对我从 SQL 迁移到 MySQL 有用:

    SELECT (CAST('1900-01-01 00:00:00' + INTERVAL CAST(CONV(substr(HEX( 0x0000A249004576D0 ),1,8), 16, 10) AS SIGNED) DAY + INTERVAL CAST(CONV(substr(HEX( 0x0000A249004576D0 ),9,8), 16, 10) AS SIGNED)* 10000/3 MICROSECOND AS DATETIME)) AS newdate
    

    【讨论】:

      【解决方案2】:

      select CAST (0x00009CEF00A25634 as datetime)2009-12-30 09:51:03.000

      这是两个整数。一个用于日期部分0x00009CEF(十进制40175),一个用于时间部分00A25634(十进制10638900)。日期部分是一个有符号整数,给出自 1900 年 1 月 1 日以来的天数。时间部分是一个表示滴答数的整数。

      一秒钟有 300 个滴答声。

      可以看出,下面的结果也是一样的

      SELECT DATEADD(MILLISECOND,10638900*10/3.0, DATEADD(DAY,40175, '19000101'))
      

      您需要弄清楚如何将其应用于postgres

      编辑:答案here 显然是这样做的。我自己没有测试过。

      【讨论】:

      • 感谢您的回答,这似乎是有道理的,但我似乎无法在 postgresql 中转换为日期时间,我只是得到 ERROR: syntax error at or near "x00009CEF00A25634" LINE 1: select CAST (0x00009CEF00A25634 as日期时间)我很厚吗?请告诉我是否是:)
      • @user754703 - 这是 SQL Server 的内部格式。上面的SELECT 语句在 SQL Server 中运行。您需要弄清楚如何使用 phppostgres 函数在此答案中应用逻辑,因为我对这两个函数都不太熟悉。
      • 我已经使用 phpmyadmin、phppgadmin 在 mysql 和 postgresql 中运行了语句 select CAST (0x00009CEF00A25634 作为日期时间),并通过命令行登录到 postgresql 服务器并且都有错误....可以吗是我的postgresql 安装?我在 psql (8.4.7)
      • @user754703 - 该语句在 SQL Server 中有效。您需要了解哪些函数可用于处理 RDBMS 中的二进制数据。我的回答只是解释了如何解码datetime 格式。
      • @user754703:那可能是smalldatetime 变成了varbinary。以下返回2009-11-30 13:01:00 的合理结果:SELECT CAST(0x9CD1030D AS smalldatetime)。追溯起来,高位词 0x9CD1 最有可能代表日期部分,而低位词 0x030D 似乎是自午夜以来的分钟数。