现在有导出的数据sql脚本一份,里面的datetime类型的值都是如下格式
CAST(0x0000A20D00EB07DD AS DateTime))根据我测试得出的结论,0x0000A20D00EB07DD 这个值是被cast把时间类型转换为binary得到的,即
CAST(时间 AS binary))现在问题就是,它的具体算法是什么,我需要在sql server外部读取该字符串并转回去,或者如果你们有别的办法直接让他输出标准格式的时间字符串也行

解决方案 »

  1.   

    如果 expression 为 binary(n)、varbinary(n)、char(n) 或 varchar(n),则 style 可以为下表中显示的值之一。表中没有列出的样式值将返回错误。值  输出  
    0(默认值)
     将 ASCII 字符转换为二进制字节,或者将二进制字节转换为 ASCII 字符。每个字符或字节按照 1:1 进行转换。如果 data_type 为二进制类型,则会在结果左侧添加字符 0x。
     
      

  2.   

    现在我就是要知道生成二进制字符串这一过程的算法,好把字符串反转换到时间去因为我是用的导出的sql脚本文件,不是用sql server本身去转的,我必须在sql server的外部靠这串字符串推出原始时间到底是多少
      

  3.   

    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后的结果再计算,才是正确的。)
      

  4.   

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

  5.   

    高手啊,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后,才转换正确。猜测是精度的原因。
      

  6.   

    DateTime数据类型是占用8个字节。其中前4个字节存储从某个基准时间点到现在的天数,后4个字节存储从凌晨0:00:00到现在的百分秒。
    默认值是1900-01-01 00:00:00.000Excel与SQL Server不一样。Excel是粗略计算,例如,计算时固定每月为30天。