cx_Oracle 和 SQL 开发者不同意 CURRENT_DATE

cx_Oracle and SQL Developer don't agree on CURRENT_DATE

以下查询在 SQL 开发人员 returns 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 开发人员和 cx_Oracle 从不同的地方获得 CURRENT_DATE 吗?

From the documentation:

CURRENT_DATE returns the current date in the session time zone, in a value in the Gregorian calendar of data type DATE.

会话时区中有重要部分。您的 SQL 开发人员和 Python 会话似乎处于不同的时区。你可以用

检查他们有什么
select sessiontimezone from dual

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

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

T运行cating 视图列可能会影响性能,因为它可能会阻止使用列上的索引(底层 table,具体取决于视图正在做什么),所以 - 再次假设正确的时区 - 你最好这样做:

WHERE acq_date_time >= trunc(CURRENT_DATE)