2014-03-29 80 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|...