如何使用to_date处理python 3.5中的无效令牌错误?

时间:2017-02-14 06:22:18

标签: python oracle python-3.x cx-oracle

我开始知道python 3.x不会接受01,02之类的值。那么,如何在使用To_date()进行SQL查询时处理这个问题。

以下是我的查询

cur.execute('select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00', 'DD-MON-YYYY hh24:mi')')

我收到以下错误

File "<ipython-input-34-c9e7408a33cb>", line 2
cur.execute('select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00', 'DD-MON-YYYY hh24:mi')')
SyntaxError: invalid token

数据库 - Oracle
使用的库 - cx_Oracle

1 个答案:

答案 0 :(得分:1)

'01 -Feb-2016 00:00'是一个字符串,Python不应该关心它包含什么。更重要的是,它是更大字符串的一部分,因此Python甚至不应该看到它。

我认为问题在于您编写SQL语句的方式:您对整个字符串和嵌入的文字使用了相同的引号。请尝试使用双引号:

"select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00', 'DD-MON-YYYY hh24:mi')"
  

“单引号和双引号有什么区别?”

这些引号由Python处理:

"select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00','DD-MON-YYYY hh24:mi')"
^                                                                                       ^

就Pythton而言,它是一个字符串。

这些引用由Oracle处理:

"select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00','DD-MON-YYYY hh24:mi')"
                                               ^                ^  ^                  ^                                                                              

它们允许Oracle数据库区分语句中的文字。

  

“理想情况下两者应该相同才能表示字符串,对吗?”

一点。从Python编译器的角度看你的原始版本:

'select * from COREDEP where PDATE >= To_Date('01-Feb-2016 00:00','DD-MON-YYYY hh24:mi')'
^                                             ^
start of string                                end of string

报价是配对。因此,匹配的引号之后的任何内容都由Python处理为非字符串。这就是为什么Python可以在字符串中看到01