如何将SQLServer“CAST(0xBB330B00 AS Date)”转换为MySQL语法

时间:2013-04-12 10:21:52

标签: java mysql sql sql-server matlab

我有一个来自SQL Server数据库的脚本,其中包含如下语句:

INSERT SPECIAL_DAYS_TABLE (Date, Description) VALUES (CAST(0xB5330B00 AS Date), 'Christmas')

我的问题:如何将其转换为有效的MySQL语法? 强制转换部分返回空日期值...

不幸的是,我无法访问SQLServer数据库,无法直接导入数据 - 脚本是我唯一可以使用的。

注意:有数百个这样的语句,所以我需要以编程方式转换MySQL或MySQL之外的转换部分(C / Java / Matlab / VB)。

编辑:根据how to cast the hexadecimal to varchar(datetime)?的答案以及Martin在下面评论中的更正

显然,0xB5330B00应解释为0x000B33B5(即反转字节)= 734133(自0001年1月1日起的天数)

CAST('0001-01-01 00:00:00' + INTERVAL CAST(0x000B33B5 AS SIGNED) DAY as date) => 2010-12-28

1 个答案:

答案 0 :(得分:1)

根据how to cast the hexadecimal to varchar(datetime)?和Martin在下面的评论中的修正,显然,0xB5330B00应解释为0x000B33B5(即,反转字节)= 734133(自0001年1月1日起的天数)

完整的答案是:

INSERT SPECIAL_DAYS_TABLE (Date, Description) VALUES (CAST('0001-01-01' + INTERVAL 0x000B33B5 DAY as date), 'Christmas')

请注意此问题/解决方案与上述问题之间的差异:

  • 对于datetime,基准SQLServer日期为1900-01-01;对于date,它是0001-01-01
  • 对于datetime,有十六进制格式的8个字节不应该被反转(最左边4个字节是日期,最右边4个字节是时间);对于date,只有4个字节被撤销

总之,这里有一个示例Matlab代码,用于将SQLServer datedatetime对象转换为等效的MySql语法:

% Convert dates in MATLAB from SQLServer => MySQL

% Datetime: byte order is NOT reversed & start date is 1/1/1900
str = regexprep(str, 'CAST\(0x(........)(........) AS DateTime\)', ...
                     'CAST(''1900-01-01'' + INTERVAL 0x$1 DAY + INTERVAL 0x$2/300 second as datetime)');

% Date: byte order is reversed & start date is 1/1/0001
str = regexprep(str, 'CAST\(0x(..)(..)(..)(..) AS Date\)', ...
                     'CAST(''0001-01-01'' + INTERVAL 0x$4$3$2$1 DAY as date)');

此代码段可以轻松适应其他编程语言。