【发布时间】:2015-09-24 03:28:29
【问题描述】:
在使用 python 和 cx_Oracle 处理日期时,我遇到了下一个问题。
这个很好用:
In [29]: cursor.execute("SELECT TO_DATE('23.09.2015','DD.MM.YYYY') FROM dual")
Out[29]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [30]: cursor.fetchone()
Out[30]: (datetime.datetime(2015, 9, 23, 0, 0),)
这也很好用:
In [33]: cursor.execute("SELECT sysdate FROM dual")
Out[33]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [34]: cursor.fetchone()
Out[34]: (datetime.datetime(2015, 9, 23, 21, 25, 16),)
但是当我使用带有日期字段 cx_Oracle 的 oracle to_date 函数时,将年份值减少到 2 位,所以我得到的是 2015 而不是 15。此处示例:
In [31]: cursor.execute("SELECT TO_DATE(TO_DATE('23.09.2015','DD.MM.YYYY'),'DD.MM.YYYY') FROM dual")
Out[31]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [32]: cursor.fetchone()
Out[32]: (datetime.datetime(15, 9, 23, 0, 0),)
这里:
In [36]: cursor.execute("SELECT TO_DATE(sysdate,'DD.MM.YYYY') FROM dual")
Out[36]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [37]: cursor.fetchone()
Out[37]: (datetime.datetime(15, 9, 23, 0, 0),)
oracle 中还有一个trunc 函数,可用于日期舍入,不会引发问题:
In [39]: cursor.execute("SELECT TRUNC(sysdate) FROM dual")
Out[39]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [40]: cursor.fetchone()
Out[40]: (datetime.datetime(2015, 9, 23, 0, 0),)
但我想我的工具可以在没有任何特定限制的情况下使用用户定义的数据库对象(包括视图)。不幸的是,这个问题无法让我正确处理日期,目前我找不到任何合适的解决方案。
编辑。 Rajesh 回答后的工作示例:
In [104]: cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT='DD.MM.YYYY'")
In [105]: cursor.execute("SELECT TO_DATE(sysdate,'DD.MM.YYYY') FROM dual")
Out[105]: <cx_Oracle.Cursor on <cx_Oracle.Connection to web@hdb:1521/db11>>
In [106]: cursor.fetchone()
Out[106]: (datetime.datetime(2015, 9, 23, 0, 0),)
【问题讨论】: