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
从不同的地方获取?
从文档中:
CURRENT_DATE
以数据类型的公历日历中的值返回会话时区中的当前日期DATE
。
会话时区是重要的部分。您的SQL Developer和Python会话似乎处于不同的时区。您可以检查他们有什么
select sessiontimezone from dual
另一个问题是,您正在执行to_date(CURRENT_DATE)
,这会使用会话的NLS_DATE_FORMAT隐式地将日期转换为字符串,然后将其显式转换回日期,这也可能有所不同。有时候,这可能会达到您想要的目的,但是当您在代码中使用预期之外的设置运行代码时,有一天可能会中断。这可能包括在0020年而不是2020年结束,或者保留您不想的时间。
大概您正在尝试删除(或更确切地说,为零)时间部分,但是如果这是意图,那么您应该这样做trunc(CURRENT_DATE)
。当然,您仍然需要正确的会话时区-即匹配您要与之比较的数据。(并根据数据类型以及如何填充你可能真正想要SYSDATE
,而不是CURRENT_DATE
;阅读的差异。)
截断视图列可能会影响性能,因为它可能会阻止使用该列(基础表的索引,取决于视图正在执行的操作)上的索引,因此-再次假设正确的时区-您可能会更好在做:
WHERE acq_date_time >= trunc(CURRENT_DATE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句