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
吗?
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_DATE
;read about the difference。)
T运行cating 视图列可能会影响性能,因为它可能会阻止使用列上的索引(底层 table,具体取决于视图正在做什么),所以 - 再次假设正确的时区 - 你最好这样做:
WHERE acq_date_time >= trunc(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
吗?
CURRENT_DATE
returns the current date in the session time zone, in a value in the Gregorian calendar of data typeDATE
.
会话时区中有重要部分。您的 SQL 开发人员和 Python 会话似乎处于不同的时区。你可以用
检查他们有什么select sessiontimezone from dual
您在执行 to_date(CURRENT_DATE)
时还有一个问题,它将日期隐式转换为字符串,然后显式将其转换回日期,两者都使用会话的 NLS_DATE_FORMAT,这也可能不同。有时这可能会做你想做的事,但有一天当你的代码在会话中使用你意想不到的设置时 运行 时会中断。这可能包括在 0020 年而不是 2020 年结束,或者在您不想的时候保留时间部分。
大概您正在尝试删除(或更确切地说,归零)时间部分,但如果这是意图,那么您应该改为 trunc(CURRENT_DATE)
。当然,您仍然需要正确的会话时区 - 即匹配您正在比较的数据。 (根据数据类型及其填充方式,您可能实际上需要 SYSDATE
而不是 CURRENT_DATE
;read about the difference。)
T运行cating 视图列可能会影响性能,因为它可能会阻止使用列上的索引(底层 table,具体取决于视图正在做什么),所以 - 再次假设正确的时区 - 你最好这样做:
WHERE acq_date_time >= trunc(CURRENT_DATE)