问题:Python 和 Oracle 之间的时差(以月为单位)显示不正确

问题描述 投票:0回答:1

我的问题的背景是:

  • Python 中的 SQL 查询可以从 Oracle 数据库中提取特定数据
  • 从 Oracle 中提取的一列/信息是有关客户在公司开立账户多长时间的信息(以年为单位)

查询特定部分

ROUND(MONTHS_BETWEEN(sysdate, TO_DATE(c.registration_date, 'dd.mm.yy')) / 12, 1) AS Years_Client

问题

  • 当我在 Oracle (SQL Developer) 中运行查询时,我收到正确的值
  • 但是当我在Python代码中运行查询时,它返回一个包含负值真正高值(例如21)的列,这首先是无意义的,其次是好吧(因为公司甚至不存在那么久

  • 检查了 Oracle 文档
  • 厌倦了在 Oracle SQL Developer 和 Python 中运行整个查询
  • 它在 Oracle 中工作得很好,但在 Python 中却不行
python oracle time to-date
1个回答
0
投票

切勿在已经是

TO_DATE
的列上使用
DATE

TO_DATE
将字符串作为第一个参数,然后向其传递
DATE
,然后 Oracle 需要将其转换为字符串,以便
TO_DATE
可以将其转换回日期 - 可以是:

  1. 毫无意义(因为已经是约会了);或

  2. 会导致错误(如您的情况),因为 Oracle 会将您的查询转换为:

    ROUND(
      MONTHS_BETWEEN(
        sysdate,
        TO_DATE(
          TO_CHAR(
            c.registration_date,
            (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
          ),
          'dd.mm.yy'
        )
      ) / 12,
      1
    )
    

    如果

    NLS_DATE_FORMAT
    dd.mm.yy
    不匹配,那么它将引发异常,或者您将得到错误的值。

要解决此问题,请删除

TO_DATE

ROUND(MONTHS_BETWEEN(sysdate, c.registration_date) / 12, 1) AS Years_Client
© www.soinside.com 2019 - 2024. All rights reserved.