【问题标题】:How to parse SQL Server binary date format in mysql?如何在 mysql 中解析 SQL Server 二进制日期格式?
【发布时间】:2016-04-07 01:40:31
【问题描述】:

如何将CAST(0xE3350B00 AS DATE)转换为mysql

我使用了各种论坛支持,结果如下

0xE3350B00 => 2059-04-03 22:56
0x0000A17F00000000 => 2013-03-12

但是两个日期都属于同一行数据,所以我确信0xE3350B00 应该转换为附近的2013-03-12,但从技术上来说没有找到它?如果转换0xE3350B00 日期,谁能帮忙??

我在 sql 函数中使用了以下代码:

return date_add(date_add("1900-01-01 00:00:00", interval conv(substr(HEX(raw_data), 5, 4), 16, 10) DAY), interval conv(substr(HEX(raw_data), 1, 4), 16, 10) MINUTE);

【问题讨论】:

  • 删除了与当前问题无关的Sql Server
  • @MartinSmith 除了你的假设之外,我没有找到任何与 sql server 相关的内容
  • @VR46 - 标签是您删除的一个相当大的线索。在这种情况下并实际尝试SELECT CAST(0xE3350B00 AS DATE), CAST(0x0000A17F00000000 AS DATETIME) 很明显,这些是从 SQL Server 导出的二进制值。
  • 是的,可能是错的
  • 实际上我添加了与@martinsmith 相同思路的标签

标签: mysql sql sql-server hex


【解决方案1】:

您的代码看起来好像在解析 SQL Server datetime 值 (though incorrectly if they have any time part)。

这看起来像 SQL Server 二进制 date 格式。

这些存储方式不同。它们占用三个字节,以字节反转整数表示自 0001-01-01 以来的天数。

你可以使用

SELECT 
      CAST(
          '0001-01-01 00:00:00' + 
          INTERVAL CAST(CONV(
                        CONCAT(substr(HEX(BinaryData),5,2),
                               substr(HEX(BinaryData),3,2),
                               substr(HEX(BinaryData),1,2))
                        , 16, 10)  AS SIGNED) DAY 
      AS DATE) AS converted_date
FROM
(
SELECT 0xE3350B00 AS BinaryData
) d

计算结果为2012-07-08

SQL Fiddle

【讨论】:

  • 感谢 Martin... 对我有很大帮助。如果您可以验证我所做的以下转换是正确的,那将更有信心 0x0000A17F00000000 => 2013-03-12
  • @AbhinavBhardwaj - 这对于 SQL Server datetime 是正确的 - 但您问题中的代码只有在时间部分为零时才能正常工作。时间部分的整数是1/300 秒。不是分钟。正确代码见stackoverflow.com/questions/4946292/…
  • 我使用以下日期时间:return CAST('1900-01-01 00:00:00' + INTERVAL CAST(CONV(substr(HEX(dttm),1,8), 16, 10) AS SIGNED) DAY + INTERVAL CAST(CONV(substr(HEX(dttm),9,8), 16, 10) AS SIGNED)* 10000/3 微秒作为日期时间);
  • 非常感谢您的解决!
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多