【问题标题】:How do you insert current system date and time?如何插入当前系统日期和时间?
【发布时间】:2019-01-23 11:09:31
【问题描述】:

我正在尝试使用以下查询插入当前系统日期和时间,当我使用 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: not a valid month

【问题讨论】:

  • 请格式化您的代码以使其易于阅读
  • sysdate 已经是一个日期,如果你将它插入到 date 列中,你根本不应该操纵它。如果您要插入timestamp-type 列,请使用systimestamp
  • 当我使用 systimestamp 时,ORA-01830:日期格式图片在转换整个输入字符串之前结束
  • 您到底为什么要将 DATE 值存储为 varchar
  • 如果列是时间戳,那么为什么要尝试在其中存储一个 VARCHAR 值?

标签: sql oracle


【解决方案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 而不是 HH 来避免这种情况,但那是一个附带问题)。然后,您将隐式转换回日期,因为这是目标列数据类型,所以您确实拥有:

to_date(to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'))

它使用你的会话 NLS_DATE_FORMAT 设置,所以真的是这样的:

to_date(to_char(sysdate, 'DD-MM-YYYY HH:MI:SS'), 'DD-MON-RR')

这确实会抛出“ORA-01843: not a valid month”。

还有你拥有的地方:

to_date('31-AUG-18', 'DD-MON-RR')

您依赖的会话语言是英语,因此您应该将其指定为to_date() 呼叫的一部分,或者使用月份数字;并且真的没有任何理由再使用 2 位数的年份了。您还可以将其替换为 ANSI 日期文字:

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() 调用中丢弃了时间部分,然后 to_timestamp() 通过将所有缺少的组件视为零而不是抱怨来“提供帮助”。

【讨论】:

    【解决方案2】:

    假设有问题的字段是 DATE 类型,它们应该是,只需插入 sysdate。

    【讨论】:

      【解决方案3】:

      to_char(sysdate, 'DD-MM-YYYY HH:MI:SS') --> 这看起来不错,

      您的错误出现在第 3 行,那么请尝试完成年份并遵循以下格式:

      to_date('31-AUG-2018', 'DD-MON-YYYY')
      

      【讨论】:

        最近更新 更多