如何在 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,所以这就是您在上面查询的输出中看到的内容。