日期:2014-05-17  浏览次数:20733 次

有人知道ms sql的cast函数把datetime算成binary的具体规则吗?
现在有导出的数据sql脚本一份,里面的datetime类型的值都是如下格式
CAST(0x0000A20D00EB07DD AS DateTime))


根据我测试得出的结论,0x0000A20D00EB07DD 这个值是被cast把时间类型转换为binary得到的,即
CAST(时间 AS binary))

现在问题就是,它的具体算法是什么,我需要在sql server外部读取该字符串并转回去,或者如果你们有别的办法直接让他输出标准格式的时间字符串也行

------解决方案--------------------
引用:
Quote: 引用:

datetime占用8个字节,前4个字节存储base date(即1900年1月1日)之前或之后的天数,后4个字节存储午夜后的毫秒数。值范围:1753-01-01 到 9999-12-31。

可以试一下这三条SQL语句:
select CAST(0x0000A20D00EB07DD AS DateTime)
select CAST(0x0000A20D00000000 AS DateTime)
select CAST(0x0000000000EB07DD AS datetime)


结果是:
2013-08-01 14:15:43.243
2013-08-01 00:00:00.000
1900-01-01 14:15:43.243

通过结果可以看出,前8位数字表示天数,后8位数表示毫秒数。

如果要进行转换,可以将前8位数字转换成十进制整数(41485),再加上1900/1/1这个日期,就是实际日期了(2013-08-01)。
(碰到一个怪现象,在sql server、oracle、delphi下,转换后是2013-08-01,但在EXCEL中,转换后却是2013-07-31,不知是什么原因)
将后8位数字转换成十进制整数(15402973),再计算出时、分、秒和毫秒。
(这里碰的怪现象是,将15402973直接计算,结果是04:16:42.970,如果是要算出14:15:43.243这个结果,必须要将15402973*10/3后的结果再计算,才是正确的。)

高手啊,1900/1/1这个基准点是你自己试出来的还是哪里查到的,微软的msdn站上都没有说明这个基准值,后面那个算时分秒毫秒的公式15402973*10/3也是你自己试出来的吗


datetime占用8个字节,前4个字节存储base date(即1900年1月1日)之前或之后的天数,后4个字节存储午夜后的毫秒数。值范围:1753-01-01 到 9999-12-31。

上面这句是在网上搜的。后面的三个SQL语句是对上面这句进行的验证。

“15402973*10/3”这个是我试出来的,因为我用15402973转换不出来14:15:43.243这个值,只有*10/3后,才转换正确。猜测是精度的原因。