【问题标题】:cx_Oracle and SQL Developer don't agree on CURRENT_DATEcx_Oracle 和 SQL Developer 不同意 CURRENT_DATE
【发布时间】:2020-12-13 07:52:13
【问题描述】:

SQL Developer 中的以下查询返回 1 条记录:

SELECT * FROM myview WHERE to_date(acq_date_time) = to_date(CURRENT_DATE)

但是,当我使用 cx_Oracle 在 Python 中执行相同的查询时,我没有得到任何记录:

query = "SELECT * FROM myview WHERE to_date(acq_date_time) = to_date(CURRENT_DATE)"
cursor.execute(query)
results = cursor.fetchall()

更令人费解的是,当我使用这个查询时,我得到了 5 个结果(我期望今天的结果加上前一天的所有结果):

query = "SELECT * FROM myview WHERE to_date(acq_date_time) > to_date(CURRENT_DATE - 1)"
cursor.execute(query)
results = cursor.fetchall()

我已经验证了SQL Developer和cx_Oracle中的连接地址是一样的。我没有收到任何错误。任何想法为什么会发生这种情况? SQL Developer 和 cx_Oracle 是否从不同的地方获取CURRENT_DATE

【问题讨论】:

  • 这可能是日期格式的问题。使用日期格式模型,尝试使用带有格式字符串的 TO_DATE 函数。见这里docs.oracle.com/cd/B19306_01/server.102/b14200/…
  • 你为什么要使用to_date() 来处理已经是约会的东西?这是多余的,并且会导致您使用不同的 NLS 设置出现问题,从而导致错误或错误的结果。目前尚不清楚这是否是问题(或部分问题); SQL Developer 和 Python 会话更有可能从不同的语言环境开始,current_date uses the session timezoneselect sessiontimezone from dual 在两者中都显示了什么?我想一个是-04:00,另一个是不同的东西,也许是UTC?

标签: python-3.x oracle cx-oracle


【解决方案1】:

From the documentation:

CURRENT_DATE 返回会话时区的当前日期,数据类型为公历 DATE

重要的部分是在会话时区。您的 SQL Developer 和 Python 会话似乎位于不同的时区。你可以检查他们有什么

select sessiontimezone from dual

您还有一个问题,因为您正在执行to_date(CURRENT_DATE),它隐式地将日期转换为字符串,然后将其显式转换回日期,两者都使用会话的 NLS_DATE_FORMAT,这也可能不同。有时,这可能会满足您的要求,但有一天,当您的代码在具有您未预料到的设置的会话中运行时,它会中断。这可能包括在 0020 年而不是 2020 年结束,或者在您不想保留时间部分。

大概您正在尝试删除(或更确切地说,为零)时间部分,但如果这是意图,那么您应该改为使用trunc(CURRENT_DATE)。当然,您仍然需要正确的会话时区 - 即匹配您要与之比较的数据。 (根据数据类型及其填充方式,您可能实际上需要SYSDATE 而不是CURRENT_DATEread about the difference。)

截断视图列可能会对性能产生影响,因为它可能会阻止(基础表的,取决于视图正在执行的操作)列上的索引被使用,因此 - 再次假设正确的时区 - 您可能做得更好:

WHERE acq_date_time >= trunc(CURRENT_DATE)

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2017-11-11
    • 2018-05-13
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多