cx_Oracle不返回1900-01-01 00:00:00.000000的毫秒数

时间:2013-10-31 23:47:55

标签: python oracle timestamp cx-oracle

当我使用cx_Oracle执行SQL查询并且结果为1900-01-01 00:00:00.000000时,返回的结果为1900-01-01 00:00:00而没有毫秒。

如果结果包含不是全零的毫秒,那么我得到包括毫秒(即1900-01-01 00:00:00.123456)的完整时间戳。

我在运行其他查询之前尝试运行ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SSXFF',但没有看到任何更改。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我猜问题是在接收方,有人为你优化数字。

您可以尝试将此时间戳作为字符串并检查结果

SELECT 
  TO_CHAR(TO_TIMESTAMP('1900-01-01', 'YYYY-MM-DD'), 'YYYY-MM-DD HH24:MI:SSXFF')
FROM dual;

答案 1 :(得分:0)

你和Nagh怀疑是正确的:这是一个Python的东西,但它只是一个展示的东西。你没有失去时间戳精度。

cx_Oracle Python库将Oracle日期类型(Date,Timestamp ..)转换为Python的日期类型之一datetime

当一个datetime对象以字符串形式打印出来时(即调用其__str__()方法),它使用datetime.isoformat()打印出ISO 8601格式 - 此方法为当它们为0时决定不打印毫秒(实际上,datetime没有毫秒字段,而是具有微秒,但是相同点。)

但是,这只是datetime对象的字符串表示。所有时间信息仍然可供您使用。

如果要始终显示毫秒 ,则必须明确;尝试使用strftime()

from datetime import datetime

now = datetime.now()
print now
# >>> 2013-11-28 15:34:47.223000
now = now.replace(microsecond=0) # Remove milliseconds
print now
# >>> 2013-11-28 15:34:47
print now.strftime('%Y-%m-%d %H:%M:%S.%f')
# >>> 2013-11-28 15:34:47.000000