oracle中的EDT和EST时间戳sqlldr数据加载
我在通过sqlloader将数据从平面文件加载到带有时间戳列的Oracle数据库时遇到问题。 问题是我有一个EST和EDT的数据,如下面提到的格式 测试数据.datoracle中的EDT和EST时间戳sqlldr数据加载,oracle,oracle11g,timezone,sql-loader,Oracle,Oracle11g,Timezone,Sql Loader,我在通过sqlloader将数据从平面文件加载到带有时间戳列的Oracle数据库时遇到问题。 问题是我有一个EST和EDT的数据,如下面提到的格式 测试数据.dat Thu Mar 07 14:27:14 EST 2013 Thu Mar 07 14:27:27 EST 2013 Tue Apr 09 18:20:54 EDT 2013 Tue Apr 09 18:24:26 EDT 2013 我的sqldrfile.ctl代码如下 LOAD DATA INFILE 'test_data.da
Thu Mar 07 14:27:14 EST 2013
Thu Mar 07 14:27:27 EST 2013
Tue Apr 09 18:20:54 EDT 2013
Tue Apr 09 18:24:26 EDT 2013
我的sqldrfile.ctl代码如下
LOAD DATA
INFILE 'test_data.dat'
TRUNCATE
INTO TABLE MY_TABLE FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(
"DOC_DATE_ADDED" TIMESTAMP WITH TIME ZONE "DY MON DD HH24:MI:SS TZR YYYY",
)
拒绝了\u数据。错误以下两条记录未被识别并进入错误文件
Tue Apr 09 18:20:54 EDT 2013
Tue Apr 09 18:24:26 EDT 2013
其他两条EST记录已正确加载到oracle表中。。我需要一个sqlldr代码来加载时间戳EST和EDT。请给我介绍一下(
EDT
ist不是有效的时区region,这是时区的缩写
有效区域如下所示:
SELECT *
FROM V$TIMEZONE_NAMES
WHERE TZNAME = TZABBREV;
TZNAME TZABBREV
======================
CET CET
CST CST
EET EET
EST EST
GMT GMT
HST HST
MET MET
MST MST
PST PST
WET WET
您通过此查询看到的原因。EDT
可能表示UTC-04:00到UTC-06:00之间的几个不同时区
SELECT TZNAME, TZ_OFFSET(TZNAME)
FROM V$TIMEZONE_NAMES
WHERE TZABBREV = 'EDT'
ORDER BY 2;
TZNAME TZ_OFFSET(TZNAME)
------------------------------- -----------------
America/Santo_Domingo -04:00
America/Fort_Wayne -05:00
America/Grand_Turk -05:00
America/Indiana/Indianapolis -05:00
America/Indiana/Marengo -05:00
America/Indiana/Petersburg -05:00
US/Michigan -05:00
America/Detroit -05:00
US/Eastern -05:00
America/Indiana/Vevay -05:00
America/Indiana/Vincennes -05:00
America/Indiana/Winamac -05:00
America/Indianapolis -05:00
America/Iqaluit -05:00
America/Jamaica -05:00
America/Kentucky/Louisville -05:00
America/Kentucky/Monticello -05:00
America/Louisville -05:00
America/Montreal -05:00
America/Nassau -05:00
America/New_York -05:00
America/Nipigon -05:00
America/Pangnirtung -05:00
America/Port-au-Prince -05:00
America/Thunder_Bay -05:00
America/Toronto -05:00
Canada/Eastern -05:00
EST5EDT -05:00
Jamaica -05:00
US/East-Indiana -05:00
America/Cancun -06:00
America/Indiana/Tell_City -06:00
32 rows selected.
我假设您必须修改您的文本文件。我不知道sqlloader是否支持任何联机转换,例如从
EST
到EST5EDT
EDT
不是有效的时区区域,这是时区缩写
有效区域如下所示:
SELECT *
FROM V$TIMEZONE_NAMES
WHERE TZNAME = TZABBREV;
TZNAME TZABBREV
======================
CET CET
CST CST
EET EET
EST EST
GMT GMT
HST HST
MET MET
MST MST
PST PST
WET WET
您通过此查询看到的原因。EDT
可能表示UTC-04:00到UTC-06:00之间的几个不同时区
SELECT TZNAME, TZ_OFFSET(TZNAME)
FROM V$TIMEZONE_NAMES
WHERE TZABBREV = 'EDT'
ORDER BY 2;
TZNAME TZ_OFFSET(TZNAME)
------------------------------- -----------------
America/Santo_Domingo -04:00
America/Fort_Wayne -05:00
America/Grand_Turk -05:00
America/Indiana/Indianapolis -05:00
America/Indiana/Marengo -05:00
America/Indiana/Petersburg -05:00
US/Michigan -05:00
America/Detroit -05:00
US/Eastern -05:00
America/Indiana/Vevay -05:00
America/Indiana/Vincennes -05:00
America/Indiana/Winamac -05:00
America/Indianapolis -05:00
America/Iqaluit -05:00
America/Jamaica -05:00
America/Kentucky/Louisville -05:00
America/Kentucky/Monticello -05:00
America/Louisville -05:00
America/Montreal -05:00
America/Nassau -05:00
America/New_York -05:00
America/Nipigon -05:00
America/Pangnirtung -05:00
America/Port-au-Prince -05:00
America/Thunder_Bay -05:00
America/Toronto -05:00
Canada/Eastern -05:00
EST5EDT -05:00
Jamaica -05:00
US/East-Indiana -05:00
America/Cancun -06:00
America/Indiana/Tell_City -06:00
32 rows selected.
我假设您必须修改文本文件。我不知道sqlloader是否支持任何在线转换,例如从
EST
到EST5EDT
如果您无法更改文件中数据的格式,并且在加载文件之前无法操作该文件,则可以使用区域值替换特定的EDT值US/EARTH>代码>(或任何合适的值,如美国/纽约
),带有:
(为了可读性,分为两行,但也可以在控制文件中这样做)
加载示例数据文件时,表包含:
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
值,使用嵌套的替换或使用:
"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的第一个列表中).如果您无法更改文件中数据的格式,并且无法在加载文件之前对其进行操作,则可以将特定EDT值替换为区域值US/Eastern
(或任何合适的值,如America/New_York
):
(为了可读性,分为两行,但也可以在控制文件中这样做)
加载示例数据文件时,表包含:
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
值,使用嵌套的替换或使用:
"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的第一个列表中).对于来自其他国家的开发商,我想在这里引用:
东部标准时间和东部日光之间的关键区别
时间在于这样一个事实:虽然它们在同一时间被使用
分区,它们在一年中的不同时间使用
东部标准时间在秋冬季节使用
从11月的第一个星期日开始使用
东部夏时制也比东部标准时间提前一小时
时间
对EDT和EST的基本理解对于处理任何编程语言的开发时间都有很大帮助。对于来自其他国家的开发人员,我想在这里引用:
东部标准时间和东部日光之间的关键区别
时间在于这样一个事实:虽然它们在同一时间被使用
分区,它们在一年中的不同时间使用
东部标准时间在秋冬季节使用
从11月的第一个星期日开始使用
东部夏时制也比东部标准时间提前一小时
时间
对EDT和EST的基本理解对于处理任何编程语言开发过程中的时间都有很大帮助