Date Teradata:BTEQ导入无效日期问题
我正在尝试通过BTEQ将数据从平面文件移植到TD。 表定义为:Date Teradata:BTEQ导入无效日期问题,date,import,teradata,Date,Import,Teradata,我正在尝试通过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 TIMES
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 );
以下是我试图加载到表中的两个示例记录:
2007年3月14日12:00:00:000AM 2007年3月15日1:27:00:000PM 2007年3月15日1:41:08:686PM 0 1 | 1 | 26 | 2007073 | 2007年3月14日12:00:00:000AM | 2007年3月15日1:27:00:000PM | 2007年3月15日1:59:40:620PM | 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中尝试了以下操作,但仍然失败:
将日期格式“mmmbddbyyy”转换为日期格式“YYYY-MM-DD”(转换(substr(:reference_dt,1,11))
您的数据是管道分隔的可变长度字符,使用的字符应与输入数据匹配,例如
system_id VARCHAR(11)
referral_dt VARCHAR(26)
VARCHAR将使用默认格式自动转换为目标数据类型。对于您的时间戳,您需要手动强制转换并添加一种格式:
referral_dt (TIMESTAMP(3),FORMAT 'mmmBddByyyyBhh:mi:ss.s(3)T')
但这会失败一个小时,Teradata总是需要两位数
如果您使用的是TD14,则最好使用Oracle TO_DATE/TO_TIMESTAMP UDF,该UDF允许单位时间:
TO_TIMESTAMP(referral_dt,'MON DD YYYY HH:MI:SS:FF3AM')
您没有数据指示的日期 前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|...
嗨,谢谢你的回复。我不在TD14上,所以第二种选择被排除了。我最初考虑的是推荐专栏。我想知道为什么子字符串函数不能工作,我可以选择日期,因为这是引用所需的?当然,您可以使用子字符串来提取日期部分。对于时间戳,您需要执行一个CASE加子字符串来添加缺少的0。嗨,我考虑将所有数据作为varchar移植到TD上的staging表中,然后在插入target时格式化它。这种方法给了我一个游乐场。谢谢你的投入。感谢:)嗨,多诺思,我过去常常为我的用例打上100%成功的时间戳。要添加的是必须修剪输入字符串。当我试图转换一个只指定时间值(单个小时)的字符串时,我遇到了这个问题。谢谢你在这方面的帮助。