【问题标题】:postgres datetime field "x00008F4900000000"postgres 日期时间字段“x00008F4900000000”
【发布时间】:2016-03-23 11:02:41
【问题描述】:

我已经在 MS SQL Server 中生成了一个表数据以将其插入 Postgresql。

脚本有这种插入格式

INSERT INTO Bank_Draft_Information (Bank_Code, Draft_Type, Transaction_Type, Institution_Code, Serial_Number, Bank_Draft_Date, Total_Amount, Balance_Amount, Created_By, Created_On, Amended_By, Amended_On) 
VALUES

 (6, 'C', 'I', NULL, NULL, 0x00008F4900000000 AS DateTime, 1500.0000, 1000.0000, 1, 0x0000950400000000 AS DateTime, 19, 0x0000A32400000000 AS DateTime));

得到错误这个错误,

“x00008F4900000000”处或附近的语法错误

更多,无法再访问 MS SQL Server 数据库了。如何将其转换为 postgres 日期时间对象?

【问题讨论】:

  • 找出它真正代表的日期,然后使用适当的文字。
  • @GordonLinoff 我不知道这个日期的格式。你知道吗?
  • SQL Server timestamp 与“真实”时间戳无关。它更像是一个行版本。它包含无法转换为任何在 SQL Server 之外可用的二进制数据。
  • @a_horse_with_no_name 为什么你认为它是时间戳而不是日期时间?
  • 因为显示的十六进制表示是timestamp 列的默认输出格式。

标签: sql sql-server postgresql datetime


【解决方案1】:

来自this article

那么 SQL Server 是如何在内部存储日期的呢?它使用 8 个字节来存储日期时间值——前 4 个用于日期,第二个 4 用于时间。 SQL Server 可以将这两组 4 个字节解释为整数。对于日期部分,SQL Server 存储的值是基准日期 1900 年 1 月 1 日之前或之后的天数。(...)

SQL Server 将时间的第二个整数存储为午夜之后的时钟滴答数。一秒包含 300 个滴答声,因此一个滴答声等于 3.3 毫秒 (ms)。您可以通过将 datetime 值转换为 binary(8) 值并使用 substring 函数提取每组 4 个字节来查看天数和时钟滴答的值。然后图 3 中的代码将每组 4 个字节转换为一个整数。

考虑到我猜测x00008F49 可能表示自 1900 年 1 月 1 日以来过去的天数,而其余字符串可能是时间表示。因为都是 0,所以它代表午夜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2023-03-26
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多