如何在 Oracle 11g table 中从 csv 加载数据时截断或转换日期时间
How to trunc or cast datetime to date in load data from csv in an Oracle 11g table
我需要转换格式为 2/5/2010 12:00:00 AM
的传入日期时间,并且它必须作为 "MM/DD/YYYY"
进入 table。我一直在研究,但找不到用于强制转换或截断传入 Datetime 的语法。我得到这个错误
SQL*Loader-350: Syntax error at line 11.
Expecting "," or ")", found "(".
, trunc(EXAMPLE_DATE) DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE
当我尝试使用此代码时
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, trunc(EXAMPLE_DATE) DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)
我试过使用 to_date、trunc 和 to_char,但我不太确定该使用哪个,以及使用它的语法。显然我不能截断 EXAMPLE_DATE
正如我正在尝试的那样。
编辑:
原始代码如下所示
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, EXAMPLE_DATE DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)
此代码可按预期使用仅包含 MM/DD/YYYY
格式日期的 csv 文件,但当给定如下所示的日期时间时:2/5/2010 12:00:00 AM
它将输出 .bad
csv目录下的文件。
您需要控制文件中的格式与您在数据文件中获得的值相匹配:
, EXAMPLE_DATE DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)
我设置了一个 table 来匹配你的例子:
create table example_table (example1 varchar2(10), example2 varchar2(10), example_date date);
一个数据文件包含:
A,B,2/5/2010 12:00:00 AM
控制文件为:
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE_TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, EXAMPLE_DATE DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)
)
运行 表示通告:
Commit point reached - logical record count 1
日志文件说:
Table EXAMPLE_TABLE:
1 Row successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
并且 table 填充了该数据:
select * from example_table;
EXAMPLE1 EXAMPLE2 EXAMPLE_DA
---------- ---------- ----------
A B 2010-02-05
你还说:
it has to go into the table as "MM/DD/YYYY"
它必须作为日期进入 table。日期没有任何内在的人类可读格式; Oracle 使用自己的内部表示来高效、明确地存储数据。当您查询 table 时,您的客户端将使用其自己的设置或您会话的 NLS_DATE_FORMAT
设置将其转换为可识别的显示格式。如果您看到的日期格式是您显示的格式,那么 client/session 就是您设置的显示格式。我的配置为 YYYY-MM-DD,所以这就是您在上面查询的输出中看到的内容。
我需要转换格式为 2/5/2010 12:00:00 AM
的传入日期时间,并且它必须作为 "MM/DD/YYYY"
进入 table。我一直在研究,但找不到用于强制转换或截断传入 Datetime 的语法。我得到这个错误
SQL*Loader-350: Syntax error at line 11.
Expecting "," or ")", found "(".
, trunc(EXAMPLE_DATE) DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE
当我尝试使用此代码时
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, trunc(EXAMPLE_DATE) DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)
我试过使用 to_date、trunc 和 to_char,但我不太确定该使用哪个,以及使用它的语法。显然我不能截断 EXAMPLE_DATE
正如我正在尝试的那样。
编辑: 原始代码如下所示
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, EXAMPLE_DATE DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)
此代码可按预期使用仅包含 MM/DD/YYYY
格式日期的 csv 文件,但当给定如下所示的日期时间时:2/5/2010 12:00:00 AM
它将输出 .bad
csv目录下的文件。
您需要控制文件中的格式与您在数据文件中获得的值相匹配:
, EXAMPLE_DATE DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)
我设置了一个 table 来匹配你的例子:
create table example_table (example1 varchar2(10), example2 varchar2(10), example_date date);
一个数据文件包含:
A,B,2/5/2010 12:00:00 AM
控制文件为:
OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE_TABLE
APPEND
FIELDS TERMINATED BY ',' optionally enclosed by '"'
TRAILING NULLCOLS
(
EXAMPLE1 CHAR NULLIF (EXAMPLE1=BLANKS)
, EXAMPLE2 CHAR NULLIF (EXAMPLE2=BLANKS)
, EXAMPLE_DATE DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)
)
运行 表示通告:
Commit point reached - logical record count 1
日志文件说:
Table EXAMPLE_TABLE:
1 Row successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
并且 table 填充了该数据:
select * from example_table;
EXAMPLE1 EXAMPLE2 EXAMPLE_DA
---------- ---------- ----------
A B 2010-02-05
你还说:
it has to go into the table as "MM/DD/YYYY"
它必须作为日期进入 table。日期没有任何内在的人类可读格式; Oracle 使用自己的内部表示来高效、明确地存储数据。当您查询 table 时,您的客户端将使用其自己的设置或您会话的 NLS_DATE_FORMAT
设置将其转换为可识别的显示格式。如果您看到的日期格式是您显示的格式,那么 client/session 就是您设置的显示格式。我的配置为 YYYY-MM-DD,所以这就是您在上面查询的输出中看到的内容。