vb.net - 需要帮助使用 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
解决方案
引用您的问题:
我还使用单个插入语句成功地将数据表中的一行数据插入到 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在这里。
推荐阅读
- angularjs - 未捕获的错误:[$injector:modulerr] - AngularJS(包括其他模块)
- r - R:测试用户定义的函数参数是否属于“逻辑”类
- floating-point - 为什么将整数 1 添加到另一个整数,然后转换为浮点数给我 0.99?
- python - 在python中动态创建并写入多个文件
- javascript - 如何在不同的行中获取显示字段
- php - 如何在自定义时间戳 expire_at 上应用 diffForHumans?
- postgresql - 如何让普通 linux 用户在没有 sudo 访问的情况下访问 postgres 数据库?
- android - ConstraintLayout 不会省略 TextView 中的长文本
- c++ - C++ 中的多文件项目和函数
- ios - 自定义滑块iOSobjective-c(增加水平滑块的高度并在拇指上添加图像)