如果您无法更改文件中数据的格式,并且无法在加载文件之前对其进行操作,则可以将特定的 EDT 值替换为区域值 US/Eastern(或任何合适的值,例如 @ 987654323@) 与an SQL operator:
"DOC_DATE_ADDED" TIMESTAMP WITH TIME ZONE "DY MON DD HH24:MI:SS TZR YYYY"
"REPLACE(:DOC_DATE_ADDED, 'EDT', 'US/Eastern')"
(为了便于阅读,分成两行,但您也可以在控制文件中这样做)。
当您的示例数据文件被加载时,表格包含:
select to_char(doc_date_added, 'YYYY-MM-DD HH24:MI:SS TZD') as TZD,
to_char(doc_date_added, 'YYYY-MM-DD HH24:MI:SS TZR') as TZR
from my_table;
TZD TZR
----------------------- ------------------------------
2013-03-07 14:27:14 EST 2013-03-07 14:27:14 EST
2013-03-07 14:27:27 EST 2013-03-07 14:27:27 EST
2013-04-09 18:20:54 EDT 2013-04-09 18:20:54 US/EASTERN
2013-04-09 18:24:26 EDT 2013-04-09 18:24:26 US/EASTERN
...所以您保留了 EST/EDT 拆分;虽然TZR 显示US/EASTERN 和EST - 所以最好也更改EST 值,使用嵌套REPLACE 或:
"DOC_DATE_ADDED" TIMESTAMP WITH TIME ZONE "DY MON DD HH24:MI:SS TZR YYYY"
"REGEXP_REPLACE(:DOC_DATE_ADDED, 'E[SD]T', 'US/Eastern')"
或者,如果您的所有值始终是 EST/EDT,您可以显式地进行时间戳转换,然后删除您获得的实际字符串:
"DOC_DATE_ADDED" CHAR "FROM_TZ(TO_TIMESTAMP(SUBSTR(:DOC_DATE_ADDED, 1, 19)
|| SUBSTR(:DOC_DATE_ADDED, 25, 29), 'DY MON DD HH24:MI:SS YYYY'), 'US/Eastern')"
将您的数据加载为:
TZD TZR
----------------------- ------------------------------
2013-03-07 14:27:14 EST 2013-03-07 14:27:14 US/EASTERN
2013-03-07 14:27:27 EST 2013-03-07 14:27:27 US/EASTERN
2013-04-09 18:20:54 EDT 2013-04-09 18:20:54 US/EASTERN
2013-04-09 18:24:26 EDT 2013-04-09 18:24:26 US/EASTERN
这样做的危险在于,如果您确实在不同的时区获得了一个值,它将被默默地记录在错误的区域中,而第一个版本将成功处理它或拒绝它,这取决于它是否被识别(即在 Wernfried 的第一个列表中)。