ORA-01830(在本地运行,但在服务器上引发错误)

时间:2020-08-12 13:53:04

标签: python oracle ora-01830

我有一个python脚本,可使用df.apply()和sql文件将记录从数据帧插入数据库中。 插入了一个日期字段,其格式如下:

df['some_date'] = pd.to_datetime(df['some_date'], format='%Y-%m-%dT%H:%M:%S.%f')
if 'datetime' in df.iloc[:, i].dtypes.name:
    log.debug("{col} was transformed to Oracle's date string format".format(col=df.columns[i]))
    # desired Oracle format is DD-MON-RR HH12:MI:SS:
    df.iloc[:, i] = df.iloc[:, i].dt.tz_convert(tz='UTC')
    df.iloc[:, i] = df.iloc[:, i].dt.strftime('%d-%b-%y %I.%M.%S.%f %p')

用于执行插入操作的sql文件如下所示:

insert into some_schema.some_table(..., some_date, ..., insert_date)
    values (..., to_timestamp(to_char(:5), 'DD-Mon-YY HH.MI.SS.FF6 PM'), ..., trunc(sysdate, 'DD'))

我也尝试使用这些方法,并且得到了相同的结果:

to_timestamp(:5, 'DD-Mon-YY HH.MI.SS.FF6 PM')
to_timestamp(:5, 'DD-Mon-YY HH.MI.SS.FF PM')

由于某种原因,当我运行此过程以在本地插入记录时,没有问题,并且记录已正确写入。但是,当它在我们的开发服务器上运行时,会发生ORA-01830错误。

“ 2010年8月10日03.04.18.909028 PM”是所插入内容的示例。

以下是一些会话信息(本地和开发服务器会话设置相同):

('NLS_NUMERIC_CHARACTERS', '.,'), ('NLS_CALENDAR', 'GREGORIAN'), ('NLS_DATE_FORMAT', 'DD-MON-RR'), ('NLS_DATE_LANGUAGE', 'AMERICAN'), ('NLS_TIME_FORMAT', 'HH.MI.SSXFF AM'), ('NLS_TIMESTAMP_FORMAT', 'DD-MON-RR HH.MI.SSXFF AM'), ('NLS_TIME_TZ_FORMAT', 'HH.MI.SSXFF AM TZR'), ('NLS_TIMESTAMP_TZ_FORMAT', 'DD-MON-RR HH.MI.SSXFF AM TZR')

2 个答案:

答案 0 :(得分:0)

to_timestamp(to_char(:5), 'DD-Mon-YY HH.MI.SS.FF6 PM')

很危险,因为TO_CHAR没有格式掩码。这意味着:5中的输入日期值将根据会话/客户端设置转换为字符串,通常您可能无法控制。请尝试尝试此操作,以确保格式对齐

to_timestamp(to_char(:5,'DD-Mon-YY HH.MI.SS.FF6 PM'), 'DD-Mon-YY HH.MI.SS.FF6 PM')

但是我觉得奇怪的是,如果您正在传入的时间戳上执行TO_CHAR,那么为什么根本需要TO_TIMESTAMP / TO_CHAR呢?

答案 1 :(得分:0)

让DBA帮助我了解数据库上实际执行的操作后,我发现服务器上有一个指向SQL文件的属性文件,该文件未格式化日期。