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错误。

"10-Aug-20 03.04.18909028 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')

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的东西呢?

在请DBA帮助我了解数据库上实际执行的内容后,我发现服务器上有一个指向sql文件的属性文件没有格式化日期。

相关内容

最新更新