Teradata采用fastload工具把库表导出,利用DB2的load命令装载
1、DATE
Teradata导出时指定其格式为'YYYY-MM-DD'
data_col (FORMAT 'YYYY-MM-DD')
|
DB2装载时指定日期格式为'YYYY-MM-DD'
2、TIME
Teradata导出时指定其格式为'HH:MI:SS'
time_col (FORMAT 'HH:MI:SS')
|
DB2装载时指定时间格式为'HH:MM:SS'
在实际运行中,发现带有TIME类型字段的表,导出后装载到DB2数据库时,总是有一些记录被抛出,通过肉眼观察无从下手,由于数据量太大,通过一个简单的Perl脚本来检查,发现Teradata数据库中存放的TIME类型字段出现了类似“15:20:60”的值,也就是秒数大于59,这样的时间值DB2是不接受的。
后来通过查Teradata的文档,发现
这还真是让人不得其解的数值。
没办法,只好对这种情况做特殊处理,所有TIME类型字段,在导出时判断一下其“second”值,超过59的全部转换成59,这样,装载DB2时就没有再抛出。
3、TIMESTAMP
Teradata导出时指定其格式为'YYYY-MM-DDBHH:MI:SS.S(6)'
timestamp_col (FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)')
|
DB2装载时指定时间格式为'YYYY-MM-DD HH:MM:SS.UUUUUU'
TIMESTAMPFORMAT="YYYY-MM-DD HH:MM:SS.UUUUUU"
|
Timestamp类型在Teradata中的取值和Time类型存在相同的问题:"second"域的最大值也是61,在导出时也要做类似的处理,大于59的秒数,全部转换成59。
结论:
Teradata对Timestamp类型的转换:
case when substr( CAST((timestamp_col (FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)')) AS VARCHAR(26)) ,18,2) > 59 then substr( CAST((timestamp_col (FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)')) AS VARCHAR(26)) ,1,17) || '59' || substr( CAST((timestamp_col (FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)')) AS VARCHAR(26)) ,20) else CAST((timestamp_col (FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)')) AS VARCHAR(26)) end
|
DB2 load命令:
LOAD CLIENT FROM xxx OF DEL MODIFIED BY COLDEL0X01 DATEFORMAT="YYYY-MM-DD" TIMESTAMPFORMAT="YYYY-MM-DD HH:MM:SS.UUUUUU" TIMEFORMAT="HH:MM:SS" ... ...
|
阅读(4117) | 评论(0) | 转发(0) |