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 格式并成功将进行隐式转换,但让数据库知道更安全。
- TRUNC 截断列 - 这将删除时间部分
SELECT *
FROM table_name
WHERE TRUNC(requested_time) = TO_DATE('01-jul-2021','DD-mon-YYYY')
FETCH FIRST 10 ROWS ONLY
- 将列日期格式化为与您提供的日期相同的格式并比较结果字符串:
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
我正在尝试使用 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 格式并成功将进行隐式转换,但让数据库知道更安全。
- TRUNC 截断列 - 这将删除时间部分
SELECT *
FROM table_name
WHERE TRUNC(requested_time) = TO_DATE('01-jul-2021','DD-mon-YYYY')
FETCH FIRST 10 ROWS ONLY
- 将列日期格式化为与您提供的日期相同的格式并比较结果字符串:
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