【问题标题】:Teradata : BTEQ Import Invalid Date IssueTeradata:BTEQ 导入无效日期问题
【发布时间】:2014-05-08 23:48:00
【问题描述】:

我正在尝试通过 BTEQ 将数据从平面文件移植到 TD。 表定义为:

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 条示例记录:
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 脚本的片段

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);


导入过程中出现以下错误:

*** 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')

【问题讨论】:

    标签: date import teradata


    【解决方案1】:

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

    system_id VARCHAR(11)
    referral_dt VARCHAR(26)
    

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

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

    但这会在一位数小时内失败,Teradata 总是需要两位数。

    如果您使用的是 TD14,则最好使用 Oracle TO_DATE/TO_TIMESTAMP UDF,它允许单位数小时:

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

    【讨论】:

    • 您好,感谢您的回复。我不在 TD14 上,所以排除了第二个选项。我最初正在考虑referrer_dt 列。我想知道为什么 substring 函数不能工作,我可以选择日期,因为这是 refer_dt 所要求的?
    • 当然你可以做一个子串来只提取日期部分。对于时间戳,您需要执行 CASE plus SUBSTRINGs 以添加缺少的 0。
    • 嗨,我想将所有数据作为 varchar 移植到 TD 的临时表中,然后在插入目标时对其进行格式化。这种方法给了我一个游乐场。感谢您的投入。欣赏它:)
    • 您好 dnoeth,我使用 TO_TIMESTAMP 的用例取得了 100% 的成功。想补充一点,必须修剪输入字符串。当我尝试仅转换指定时间值(单小时)的字符串时,我遇到了这个问题。感谢您在这方面的帮助。
    【解决方案2】:

    您的数据没有指明日期。

    预期的前 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|...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2016-12-09
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多