当我使用to_timestamp(sysdate,'DD-MON-RR HH24.MI.SSXFF')
时,我尝试使用以下查询插入当前系统日期和时间。
如果我将其更改为to_char(sysdate,'DD-MM-YYYY HH:MI:SS')
,则会收到“无效的月份错误”
insert into drv.t_evthst1 (
vehicle_no,
business_txn_date,
business_txn_time,
business_txn_count,
part_vehicle_no,
business_txn,
bus_txn_appl_rslt,
act_eps_date,
act_eps_time,
business_txn_src,
event_code,
event_indicator,
activity_code,
fnl_stock_status,
old_fnl_stock_st,
coveh_status,
old_coveh_status,
damg_status,
old_damg_status,
apt_status,
old_apt_status,
reg_status,
old_reg_status,
consign_status,
old_consign_status,
demo_veh_status,
old_demo_veh_st,
ordering_status,
old_ordering_st,
hold_status,
old_hold_status,
ctms_clear_status,
old_ctms_clear_st,
invc_status,
old_invc_st,
ibmsnap_logmarker,
created_by,
created_ts,
updated_by,
updated_ts,
src_sys_id
)
values (
'0004VT9K',
to_date('31-AUG-18', 'DD-MON-RR'),
to_date('01-JAN-01', 'DD-MON-RR'),
8,
'1',
'PR01',
'01',
to_date('31-AUG-18', 'DD-MON-RR'),
to_date('01-JAN-01', 'DD-MON-RR'),
'DREPP750',
'60',
' ',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
'0',
' ',
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'DRVMRSP1',
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'DRVMRSP1',
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'1750'
)
从第3行开始的错误-
错误报告-ORA-01843:无效月份
答案 0 :(得分:1)
假设相关列定义为DATE
和/或TIMESTAMP
,则根本不要操纵sysdate
(或systimestamp
)值。
代替:
...
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'DRVMRSP1',
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'DRVMRSP1',
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'),
'1750'
只需:
...
sysdate,
'DRVMRSP1',
sysdate,
'DRVMRSP1',
sysdate,
'1750'
或
...
systimestamp,
'DRVMRSP1',
systimestamp,
'DRVMRSP1',
systimestamp,
'1750'
使用类似的方法插入日期列时:
to_char(sysdate, 'DD-MM-YYYY HH:MI:SS')
您正在将当前日期和时间转换为字符串(但是需要12小时的时间,因此您无法区分AM和PM-您可以使用HH24
而不是{{1}来避免这种情况},但这是附带问题)。然后,您将隐式转换回日期,因为这是目标列数据类型,所以实际上您具有:
HH
使用您的会话to_date(to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'))
设置,因此实际上是这样的:
NLS_DATE_FORMAT
的确会抛出“ ORA-01843:无效的月份”。
还有您在的地方:
to_date(to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'), 'DD-MON-RR')
您所依赖的会话语言为英语,因此您应该在to_date('31-AUG-18', 'DD-MON-RR')
通话中指定该会话语言,或者使用月份号;而且实际上没有任何理由再使用两位数的年份。您也可以将其替换为ANSI日期文字:
to_date()
似乎您正在将date '2018-08-31'
和时间分为两列,这也没有任何意义。
当我使用
business_txn_date
时,我没有时间。
那也是由于隐式转换-实际上,再次猜出您的to_timestamp(sysdate,'DD-MON-RR HH24.MI.SSXFF')
,是这样做的:
NLS_DATE_FORMAT
因此,您丢弃了隐式to_timestamp(to_char(sysdate, 'DD-MON-RR'), 'DD-MON-RR HH24.MI.SSXFF') from dual;
调用中的时间部分,然后to_char()
通过将所有缺少的组件都视为零而不是抱怨而变得“有帮助”。
答案 1 :(得分:0)
假设相关字段的类型为DATE,应该是,只需插入sysdate。
答案 2 :(得分:0)
to_char(sysdate,'DD-MM-YYYY HH:MI:SS')->看起来不错,
您的错误位于第3行,然后请尝试填写年份并遵循以下格式:
to_date('31-AUG-2018', 'DD-MON-YYYY')