错误 ORA-01841:在文件中传递出生日期时

Posted

技术标签:

【中文标题】错误 ORA-01841:在文件中传递出生日期时【英文标题】:Error ORA-01841: when passing date of birth in a file 【发布时间】:2014-08-23 06:54:22 【问题描述】:

我在文件中将“19851003”作为出生日期传递,但在日志文件中出现以下错误。

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

知道为什么会出现错误,因为我只将它作为字符串传递

日志文件错误:

error processing column DATE_OF_BIRTH in row 2 for datafile /xfer/x/directory/filename.csv
ORA-01841: (full) year must be between -4713 and +9999, and not be 0

我的餐桌代码:

CREATE TABLE table_name
(
  ID                  VARCHAR2(10 BYTE),      
  FIRST_NAME          VARCHAR2(150 BYTE),
  LAST_NAME           VARCHAR2(150 BYTE),
  MIDDLE_NAME         VARCHAR2(150 BYTE),
  DATE_OF_BIRTH       DATE
)

ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
  DEFAULT DIRECTORY DIRECTORY_TABLES
  ACCESS PARAMETERS 
  (RECORDS  DELIMITED BY '\n'
   SKIP 1
   BADFILE  DIRECTORY_TABLES:'filelist.bad'
   LOGFILE  DIRECTORY_TABLES:'filelist.log'
   DISCARDFILE   DIRECTORY_TABLES:'filelist.dsc'
   FIELDS TERMINATED BY ','
   OPTIONALLY ENCLOSED BY '"'
   MISSING FIELD VALUES ARE NULL
   REJECT ROWS WITH ALL NULL FIELDS
   (ID                  ,
    FIRST_NAME          ,
    LAST_NAME           ,
    MIDDLE_NAME         ,
    DATE_OF_BIRTH       DATE "YYYYMMDD" 
   )
)
LOCATION (DIRECTORY_TABLES:'filename.csv')
)
REJECT LIMIT 0
NOPARALLEL
NOMONITORING;

我的 CSV 文件:

"id","First Name","Last Name","MI","DOB"
"2","Felicia","Brown","M","19810209"
"3","Jose","Romero","M","19890706"
"4","Valerie","Moore","","19621112"

【问题讨论】:

该表是否需要该特定列的日期数据类型? 请查看编辑。我添加了我的代码 您的filename.csv 中是否存在不良数据? 我猜你希望FIELDS TERMINATED BY 行的最后一个字符是撇号,但它是另外一回事 - 看看上面突出显示的自动语法 - 它相当混乱。尝试将最后一个字符更改为适当的撇号。 (这可能只是在此处发布时格式错误,但可能不是...... :-)。分享和享受。 @user3809240 - 这不是 Bob 的意思。查看FIELDS TERMINATED BY ',’ - 最后一个字符是 而不是'。这看起来像是一个智能报价问题。稍后您似乎也有。能否也显示 CSV 文件的前几行? 【参考方案1】:

在 DATE_OF_BIRTH 的规范中,需要一个日期格式规范。试试:

DATE_OF_BIRTH  CHAR DATE_FORMAT DATE MASK "YYYYMMDD"

Reference here 然后搜索“date_format_spec”

分享和享受。

【讨论】:

【参考方案2】:

19851003 不在 -4713 和 9999 之间,就像错误所说的那样。

我怀疑你想通过 1985 作为年份并且你不小心传递了一个完整的日期 (yyyyMmdd)

【讨论】:

不,我正在传递一个日期......其格式是 YYYYMMDD 这也是我在创建表格时所写的 您的存储过程或表期望什么数据类型?您的问题说“过了一年”,但您的评论说日期。请你澄清一下? 你能发布坏文件和日志吗?从发布的信息中,这个问题的答案并不明显。另外,您可以尝试将分隔符指定为 NEWLINE 而不是 '\n' 吗? 您是否尝试将“'\n'”更改为“NEWLINE”?您可以发布以下内容吗: sed 's/[A-Za-z]/x/g' filename.csv |头-2 | od -c 。这将隐藏名称,但显示数据文件及其格式。

以上是关于错误 ORA-01841:在文件中传递出生日期时的主要内容,如果未能解决你的问题,请参考以下文章

oracle 全年度值没有为零 为啥还出 ora-01841

ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0 提示

ORA-01841 :(full) year 必须在 -4713 和 +9999 之间,并且在使用 DBMS_SQL 绑定到动态 sql 时不能为 0

从 Access 导出到 Excel 时出现日期超出范围错误

JsonSchema2Pojo,出生日期使用类型编号生成,我正在尝试以整数形式传递值

为啥在将命令行图像文件中的参数作为参数传递时出现错误