0

我有一个 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.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')
4

2 回答 2

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

于 2020-08-17T07:19:00.843 回答
0

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

于 2020-08-18T12:55:11.950 回答