sql server2000通过link server查询oracle中数据,然后into到本地数据中,当遇到oralce侧date型字段时,sql server侧报错“将数据类型 DBTYPE_DBTIMESTAMP 转换为 datetime 时出错。”,我采用convert(datetime,字段名),仍然报错,这是为什么,如何解决?

解决方案 »

  1.   

    convert(varchar(22),字段名,120)
    cast(字段名 as datetime)
      

  2.   

    联机帮助CAST 和 CONVERT
    将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。语法
    使用 CAST:CAST ( expression AS data_type ) 使用 CONVERT:CONVERT (data_type[(length)], expression [, style])参数
    expression是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。 data_type目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。 lengthnchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 style日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。不带世纪数位 (yy) 带世纪数位 (yyyy) 
    标准 
    输入/输出** 
    - 0 或 100 (*)  默认值 mon dd yyyy hh:miAM(或 PM) 
    1 101 美国 mm/dd/yyyy 
    2 102 ANSI yy.mm.dd 
    3 103 英国/法国 dd/mm/yy 
    4 104 德国 dd.mm.yy 
    5 105 意大利 dd-mm-yy 
    6 106 - dd mon yy 
    7 107 - mon dd, yy 
    8 108 - hh:mm:ss 
    - 9 或 109 (*)  默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM) 
    10 110 美国 mm-dd-yy 
    11 111 日本 yy/mm/dd 
    12 112 ISO yymmdd 
    - 13 或 113 (*)  欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h) 
    14 114 - hh:mi:ss:mmm(24h) 
    - 20 或 120 (*)  ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff] 
    - 21 或 121 (*)  ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff] 
    - 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格) 
    - 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM 
    - 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM 
    *    默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。
    ** 当转换为 datetime 时输入;当转换为字符数据时输出。
    *** 专门用于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换,输出格式如表中所示。对于从 float、money 或 smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到 character 数据的转换,输出等同于 style 1。
      

  3.   

    select 
    'CA'+right('0000000'+cast(a.eventid as varchar(10)),7) as IncidentID, 
    a.eventtypename as WarningName, 
    a.eventbody as WarningDesc, 
    a.eventlevelname as WarningRank, 
    a.eventalarmdatetime as WarningTime, 
    a.eventcategoryname as ManageSysName, 
    a.eventoperationid  as Eventoperationid, 
    a.eventoperationname as EventoperationName, 
    c.ProjectCode as ProjectCode, 
    a.alarmtypename as WarningType, 
    a.devicecode as HostName, 
    b.devicename as DeviceName, 
    b.deviceip as DeviceIP, 
    a.eventplacename as WarningAddress, 
    a.dealman as DealManID, 
    a.dealdatetime as Dealdatetime, 
    a.dealmethod as DealMethod, 
    b.deviceos as deviceos 
    from ECCPORTAL..CMCE.ECTF_EVENTS_T a,ECCPORTAL..CMCE.ECTF_DEVICES b,V_EVENT_PJ c 
    where cast(a.eventalarmdatetime as datetime) >=GETDATE()-1 
    and   cast(a.eventalarmdatetime as datetime) <=GETDATE() 
    and   a.deviceid=b.deviceid 
    and   a.eventoperationid=c.EVENTOPERATIONID a.eventalarmdatetime,a.dealdatetime在Oracle侧为Date类型,但我sqlserver侧执行以上脚本仍然报错:
    服务器: 消息 8114,级别 16,状态 8,行 1 
    将数据类型 DBTYPE_DBTIMESTAMP 转换为 datetime 时出错。不是已经cast转换了吗?为何还报错,按理说都是日期型字段,没有必要转换啊,这是为什么?
      

  4.   

    oracle与sql server对时间存储的格式不一致,oracle是7个字节,sql server 的datetime是8个字节。试试先有to_date转换为一定的时间格式试试。(不一定可行^_^)
      

  5.   

    我是在sql server侧执行这样的脚本,如何使用to_date?