从sybase向oracle导入时间类型的数据
例:有表
--sybase
create table t_test(
mydate datetime)
go
--oracle
create t_test(mydate date)
方法1:在sybase侧建立视图,然后从导出视图(此方法舍弃了毫秒部分)
create view v_test as
select
convert(varchar(10),pst_exec_stime,111)+' '+convert(varchar(9),pst_exec_stime,8) mydate
from t_test
go
format文件如下(c:\test.fmt)
10.0
1
1 SYBCHAR 0 20 "\t" 1 my_date
命令
C:\>bcp testdb..v_test out c:\test.dat -f c:\test.fmt –Uusername –Ppassword –Ssybser
Oracle导入control文件如下(c:\test.ctl)
Load data
Infile "c:\test.dat"
Badfile "c:\test.bad"
Append into table t_test
Fields terminated by'\t'(
Mydate "yyyy/mm/dd hh24:mi:ss"
)
命令
C:\>sqlldr username/password@sid control="c:\test.ctl" log="test.log"
方法2:和方法1类似不过不用建视图(此方法舍弃了毫秒部分)
format文件如下(c:\test.fmt)
10.0
1
1 SYBCHAR 0 26 "\t" 1 my_date
命令
C:\>bcp testdb..t_test out c:\test.dat -f c:\test.fmt –Uusername –Ppassword –Ssybser
Oracle导入control文件如下(c:\test.ctl)
Load data
Infile "c:\test.dat"
Badfile "c:\test.bad"
Append into table t_test
Fields terminated by'\t'(
Mydate "DECODE(:mydate,NULL,TO_DATE('','MM-DD-YYYY'),TO_DATE(SUBSTRB(:mydate,1,instrb(:mydate,':',-1)-1)||' '|| SUBSTRB(:mydate,-2),,'Mon dd yyyy hh:mi:ss PM'))"
)
命令
C:\>sqlldr username/password@sid control="c:\test.ctl" log="test.log"
如果sybase和oracle的语言不一致,即导入的am/pm保留字为上午/下午什么的可以在sqlldr之前执行如下命令,转换成和sybase一致的语言
C:\>set NLS_LANG=American(美国语)
方法3:9i以上版本适用,在方法2的基础上进行改动即可(此方法保留毫秒部分)
将方法2的Oracle导入control文件修改如下(c:\test.ctl)
Load data
Infile "c:\test.dat"
Badfile "c:\test.bad"
Append into table t_test
Fields terminated by'\t'(
Mydate timestamp "MON DD YYYY HH:MI:SS:FF3AM"
)
其他同方法2
转自:http://hi.baidu.com/teemzhang/blog/item/bc709a8625b9503a66096e0f.html