Chinaunix首页 | 论坛 | 博客
  • 博客访问: 372452
  • 博文数量: 28
  • 博客积分: 455
  • 博客等级: 下士
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 11:10
文章分类

全部博文(28)

文章存档

2016年(5)

2014年(1)

2013年(10)

2011年(7)

2010年(5)

我的朋友

分类:

2010-04-10 11:49:36

Teradata采用fastload工具把库表导出,利用DB2的load命令装载
 
1、DATE
 
Teradata导出时指定其格式为'YYYY-MM-DD'
 

data_col (FORMAT 'YYYY-MM-DD')

DB2装载时指定日期格式为'YYYY-MM-DD'


DATEFORMAT="YYYY-MM-DD"


 

2、TIME

Teradata导出时指定其格式为'HH:MI:SS'
 

time_col (FORMAT 'HH:MI:SS')

DB2装载时指定时间格式为'HH:MM:SS'
 

TIMEFORMAT="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) |
给主人留下些什么吧!~~