2014-03-29 67 views
0

我想通过BTEQ将数据从平面文件移植到TD。 表定义为:
Teradata:BTEQ导入无效日期问题

CREATE MULTISET TABLE _module_execution_log 
(
    system_id INTEGER, 
    process_id INTEGER, 
    module_id INTEGER, 
    julian_dt INTEGER, 
    referral_dt DATE FORMAT 'YYYY-MM-DD', 
    start_dt_tm TIMESTAMP(6), 
    end_dt_tm TIMESTAMP(6), 
    ref_s_cnt INTEGER, 
    ref_d_cnt INTEGER) 
    PRIMARY INDEX (module_id); 


以下是我试图在表中装载2个样品记录:

USING 
( system_id INTEGER 
    ,process_id INTEGER 
    ,module_id INTEGER 
    ,julian_dt INTEGER 
    ,referral_dt DATE FORMAT 'YYYY-MM-DD' 
    ,start_dt_tm TIMESTAMP 
    ,end_dt_tm TIMESTAMP 
    ,ref_s_cnt INTEGER 
    ,ref_d_cnt INTEGER 
)   

INSERT INTO _module_execution_log 
( system_id 
    ,process_id 
    ,module_id 
    ,julian_dt 
    ,referral_dt 
    ,start_dt_tm 
    ,end_dt_tm 
    ,ref_s_cnt 
    ,ref_d_cnt 
) 
VALUES ( 
    :system_id 
    ,:process_id 
    ,:module_id 
    ,:julian_dt 
    ,:referral_dt 
    ,:start_dt_tm 
    ,:end_dt_tm 
    ,:ref_s_cnt 
    ,:ref_d_cnt); 


我得到了
1|1|30|2007073|Mar 14 2007 12:00:00:000AM|Mar 15 2007 1:27:00:000PM|Mar 15 2007 1:41:08:686PM|0|0 1|1|26|2007073|Mar 14 2007 12:00:00:000AM|Mar 15 2007 1:27:00:000PM|Mar 15 2007 1:59:40:620PM|0|0
摘录我BTEQ脚本进口时出现以下错误:

*** Failure 2665 Invalid date. 
      Statement# 1, Info =5 


*** Failure 2665 Invalid date. 
      Statement# 1, Info =5 


这个问题肯定与第5列中的导出日期有关。我无法修改导出查询。
我试图在BTEQ以下但仍然未能:
cast(cast(substr(:referral_dt,1,11) as date format 'MMMBDDBYYYY') as date format 'YYYY-MM-DD')

回答

1

你的数据是管道分隔的可变长度字符和USING应该匹配输入数据,例如

system_id VARCHAR(11) 
referral_dt VARCHAR(26) 

VarChars将自动转换为使用默认格式的目标数据类型。为了您的时间戳,你需要手动添加投的格式:

referral_dt (TIMESTAMP(3),FORMAT 'mmmBddByyyyBhh:mi:ss.s(3)T') 

但这将失败单个数字小时,Teradata数据总是想两位数。

如果你在你TD14更好地利用甲骨文TO_DATE/TO_TIMESTAMP UDF的,允许单个数字小时:

TO_TIMESTAMP(referral_dt,'MON DD YYYY HH:MI:SS:FF3AM') 
+0

嗨,谢谢你的回复。我不在TD14上,所以排除了第二种选择。我最初考虑的是referral_dt列。我想知道为什么不能子字符串函数工作,我可以选择日期,因为这是referral_dt所需的日期? – Allzhere

+0

当然,你可以做一个子串来提取日期部分。对于时间戳,你需要做一个CASE plus SUBSTRINGs来添加缺少的0。 – dnoeth

+0

嗨,我想将所有数据作为varchar移植到TD上的临时表中,然后在插入目标时对其进行格式化。这种方法给了我一个操场。感谢您的投入。欣赏它:) – Allzhere

0

您没有通过您的数据所指示的日期。预计

前4个值是整数,那么一个日期,然后时间戳:

system_id INTEGER, 
process_id INTEGER, 
module_id INTEGER, 
julian_dt INTEGER, 
**referral_dt DATE FORMAT 'YYYY-MM-DD'**, 
start_dt_tm TIMESTAMP(6), ... 

你的数据不匹配:

1|1|30|2007073|Mar 14 2007 12:00:00:000AM|Mar 15 2007 1:27:00:000PM|Mar 15 2007 1:41:08:686PM|0|0 

你缺少日期:

1|1|30|2007073|**????-??-??**| Mar 14 2007 12:00:00:000AM|...