需要帮助使用OracleBulkCopy插入时间戳

问题描述 投票:0回答:1

我有一个数据表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-20-MAY-20 19:46:00

vb.net oracle timestamp format bulkinsert
1个回答
0
投票

从您的问题中引用:

我还成功地将数据表中的一行数据插入到 Oracle数据库使用单个插入语句并插入 使用批量功能和所有Oracle列的数据表 定义为VARCHAR2(符合预期)。

如果这对您有用,也许您可​​以将DATE类型的列添加到表中(在Oracle中),然后在其中进行字符串->日期转换(如果您愿意,可以在其后删除原始的VARCHAR2列想要)。

documentation:“对于每个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.

查询-使用不同的日期格式

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 here

© www.soinside.com 2019 - 2024. All rights reserved.