我有一个数据表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
从您的问题中引用:
我还成功地将数据表中的一行数据插入到 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。