首页 > 解决方案 > 需要帮助使用 OracleBulkCopy 插入时间戳

问题描述

我有一个数据表 dtXXX,其中包含一个包含日期格式数据的字符串列。当我尝试使用 OracleBulkCopy 插入数据时,出现以下两个错误之一:“ORA-1830 日期格式图片在转换整个输入字符串之前结束”或“ORA-1849:小时必须介于 1 和 12 之间”。

我已尝试将 dtXXX 中的列格式化为 System.DateTime(“05/04/2020 7:46:00 PM”,给我“ORA-1843:不是有效月份”错误)并保留未定义的格式。我在数据表中为日期字符串使用了多种格式:“12-MAY-20 19:46:00”、“12-MAY-20 19:46:00:000000”、“12-MAY-20 19: 46:00.000000" 并尝试将日期用单引号括起来。我尝试将 Oracle 表中的列格式更改为 DATE 和 TIMESTAMP。似乎没有任何效果。

唯一的区别是,当 Oracle 列定义为 DATE 时,我得到“ORA-1830:日期格式图片在转换整个输入字符串之前结束”错误。当 Oracle 列被定义为 TIMESTAMP 时,我得到“ORA-1849:小时必须在 1 到 12 之间”错误。

我还使用单个插入语句成功地将数据表中的一行数据插入到 Oracle 数据库中,并使用批量函数插入数据表,所有 Oracle 列都定义为 VARCHAR2(如预期的那样)。

我已经在线检查了多个数据源,但找不到针对此特定问题的任何简明回复或有用信息。任何帮助表示赞赏。

dtXXX 数据:

Col1 Col2 日期

XXX XXX 04-5-20 19:46:00

标签: vb.netoracletimestampformatbulkinsert

解决方案


引用您的问题:

我还使用单个插入语句成功地将数据表中的一行数据插入到 Oracle 数据库中,并使用批量函数插入数据表,所有 Oracle 列都定义为 VARCHAR2(如预期的那样)。

如果这对你有用,也许你可以在你的表中添加一个 DATE 类型的列(在 Oracle 中),然后在那里进行字符串 -> 日期转换(如果你愿意,你可以在那之后删除原始的 VARCHAR2 列) .

来自文档:“对于每个 DATE 值,Oracle 数据库存储以下信息:世纪、年、月、日期、小时、分钟和秒。”

使用 DATE 列时,请考虑:不存储“日期格式”。为了以某种格式获取日期,请使用 TO_CHAR() 并选择您需要的任何格式。

示例:假设我们有 2 个表(代表您的数据源和您的“Oracle”表)

create table dtxxx (
  col1 varchar2( 3 )
, col2 varchar2( 3 )
, date_ varchar2( 18 )  -- <- date as varchar2, BAD!
) ;

create table myimport(
  col1 varchar2( 3 )
, col2 varchar2( 3 )
, datestring varchar2( 18 )  -- <- date as varchar2, BAD!
) ;

-- dtXXX data
begin
insert into dtxxx ( col1, col2, date_ ) 
  values ( 'XXX', 'XXX', '04-MAY-20 19:46:00' ) ;
insert into dtxxx ( col1, col2, date_ ) 
  values ( 'yyy', 'yyy', '05-MAY-20 20:47:01' ) ;
insert into dtxxx ( col1, col2, date_ ) 
  values ( 'zzz', 'zzz', '06-MAY-20 21:48:02' ) ;
end ;
/

进口

insert into myimport ( col1, col2, datestring )
select
  col1
, col2
, date_
from dtxxx ;
-- 3 rows created.

-- add a DATE column to the MYIMPORT table
alter table myimport add dt date ;
-- Table altered.

-- myimport now contains a "date" as varchar2, 
-- and an empty DATE column
SQL> select * from myimport ;
COL1   COL2   DATESTRING           DT   
XXX    XXX    04-MAY-20 19:46:00        
yyy    yyy    05-MAY-20 20:47:01        
zzz    zzz    06-MAY-20 21:48:02 

将 varchar2(字符串)值转换为日期

update myimport
set dt = to_date( datestring, 'DD-MON-YY HH24:MI:SS' )
;  
-- 3 rows updated.

QUERY - 使用不同的日期格式

select 
  col1
, col2
, dt
, to_char( dt, 'YYYY-MM-DD HH24:MI:SS' ) fmt1
, to_char( dt, 'MM/DD/YY HH:MI:SS PM' )  fmt2
from myimport ;


COL1   COL2   DT          FMT1                  FMT2                   
XXX    XXX    04-MAY-20   2020-05-04 19:46:00   05/04/20 07:46:00 PM   
yyy    yyy    05-MAY-20   2020-05-05 20:47:01   05/05/20 08:47:01 PM   
zzz    zzz    06-MAY-20   2020-05-06 21:48:02   05/06/20 09:48:02 PM 

将“日期字符串”转换为 DATE 后,您可以在查询时对其进行格式化。DBfiddle在这里


推荐阅读