我有一个来自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
答案 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 date
和datetime
对象转换为等效的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)');
此代码段可以轻松适应其他编程语言。