【问题标题】:cx_Oracle not returning milliseconds for 1900-01-01 00:00:00.000000cx_Oracle 没有返回 1900-01-01 00:00:00.000000 的毫秒数
【发布时间】:2013-10-31 23:47:54
【问题描述】:

当我使用 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',但没有看到任何变化。

有什么想法吗?

【问题讨论】:

    标签: python oracle timestamp cx-oracle


    【解决方案1】:

    你和 Nagh 猜对了:这是 Python 的东西,但它只是一个展示的东西。您不会丢失时间戳精度。

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

    datetime 对象作为字符串打印出来时(即,它的__str__() 方法被调用),它以ISO 8601 格式打印出来,使用datetime.isoformat() - 这个方法是决定不打印的地方当它们为 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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如果我运行select to_char(<field name>, 'YYYY-MM-DD HH24:MI:SSXFF'),它可以完美运行,但我不想每次都将它添加到 SQL 查询中。
      • 好吧,那就是python方面的罪魁祸首。不能帮助你。对python还不是很熟悉。
      猜你喜欢
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多