我有一个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')
答案 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文件的属性文件,该文件未格式化日期。