使用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),)
答案 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进行当前会话时会发生这种情况。