Python:cx_Oracle 不喜欢我输入日期的方式

Python: cx_Oracle does not like how I am entering date

我正在尝试使用 Cx_oracle 模块在 python 中执行一个简单的 select all 查询。当我对 table 中的前十行全部执行 select 时,我能够打印输出。但是,当我为 table 中特定日期的前十行执行 select 时,所有打印出来的都是这样的空白列表:[].

这里是查询select所有打印出所有结果的查询:

sql_query = "select * from table_name fetch first 10 rows only"
cur = db_eng.OpenCursor()
db_eng.ExecuteQuery(cur, sql_query)
result = db_eng.FetchResults(cur)
print(result)

以上查询有效并且能够打印出结果。

这是我遇到问题的查询,下面的查询适用于 sql 开发人员:

sql_query = "select * from table_name where requested_time = '01-jul-2021' fetch first 10 rows only"
cur = db_eng.OpenCursor()
db_eng.ExecuteQuery(cur, sql_query)
result = db_eng.FetchResults(cur)
print(result)

我也尝试过这种方式,在查询之外定义日期。

specific_date = '01-jul-2021'
sql_query = "select * from table_name where requested_time = '{0}' fetch first 10 rows only".format(specific_date)
cur = db_eng.OpenCursor()
db_eng.ExecuteQuery(cur, sql_query)
result = db_eng.FetchResults(cur)
print(result)

Oracle 日期有 时间部分。查询

select * from table_name where requested_time = '01-jul-2021' fetch first 10 rows only

只会为您提供列 requested_time 的值为 01-jul-2021 00:00 的行。很可能您还有其他行也有时间部分。 要切断时间部分,有几种选择。请注意,我明确地将 a TO_DATE 函数添加到日期 - 您假设数据库是 expecting a dd-mon-yyyy 格式并成功将进行隐式转换,但让数据库知道更安全。

  1. TRUNC 截断列 - 这将删除时间部分
SELECT * 
  FROM table_name 
 WHERE TRUNC(requested_time) = TO_DATE('01-jul-2021','DD-mon-YYYY')
 FETCH FIRST 10 ROWS ONLY
  1. 将列日期格式化为与您提供的日期相同的格式并比较结果字符串:
SELECT * 
  FROM table_name 
 WHERE TO_CHAR(requested_time,'DD-mon-YYYY') = '01-jul-2021'
 FETCH FIRST 10 ROWS ONLY

示例:

pdb1--KOEN>create table test_tab(requested_time DATE);

Table TEST_TAB created.

pdb1--KOEN>BEGIN
  2  INSERT INTO test_tab(requested_time) VALUES (TO_DATE('08-AUG-2021 00:00','DD-MON-YYYY HH24:MI'));
  3  INSERT INTO test_tab(requested_time) VALUES (TO_DATE('08-AUG-2021 01:00','DD-MON-YYYY HH24:MI'));
  4  INSERT INTO test_tab(requested_time) VALUES (TO_DATE('08-AUG-2021 02:10','DD-MON-YYYY HH24:MI'));
  5  END;
  6  /


PL/SQL procedure successfully completed.

pdb1--KOEN>SELECT COUNT(*) FROM test_tab WHERE requested_time = TO_DATE('08-AUG-2021','DD-MON-YYYY');

  COUNT(*)
----------
         1
--only 1 row. That is the rows with time 00:00. Other rows are ignored

pdb1--KOEN>SELECT COUNT(*) FROM test_tab WHERE TRUNC(requested_time) = TO_DATE('08-AUG-2021','DD-MON-YYYY');

-- all rows

  COUNT(*)
----------
         3