在某些特定情况下,Cx_oracle在日期字段中削减年份

时间:2015-09-23 18:51:10

标签: python cx-oracle

使用python& amp处理日期时,我遇到了下一个问题。 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),)

但是当我使用带有日期字段的oracle to_date函数时,cx_Oracle会将年份值减少到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),)

但我想我的工具可以使用用户定义的数据库对象(包括视图),而不需要任何特定的重新划分。不幸的是,这个问题不能让我正确使用日期,目前我无法找到合适的解决方案。

EDIT。 Rajesh's asnwer之后的工作实例:

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),)

1 个答案:

答案 0 :(得分:2)

这个问题的简单答案是不再使用日期函数的to_date。

您的转换功能应为

a)to_date(string_column,'string_representation')如果您尝试将某些内容转换为日期

b)to_char(date_column,'string_representation')如果您尝试将日期中的内容转换为字符串,通常用于报告,假脱机或打印。

如果您想了解奇怪的行为,可以查看会话的NLS设置。当你说TO_DATE(sysdate,...)时,to_date需要一个字符串,所以我认为Oracle会尝试隐式地将sysdate转换为strng。使用NLS_DATE_FORMAT进行当前会话时会发生这种情况。