如何插入当前系统日期和时间?

时间:2019-01-23 11:09:32

标签: sql oracle

当我使用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:无效月份

3 个答案:

答案 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')