【问题标题】:How to query for rows inserted after a certain date如何查询在某个日期之后插入的行
【发布时间】:2016-06-29 10:05:27
【问题描述】:

我正在使用 Python2、Oracle10g 和 cxOracle。

在我的 Python 代码中,我有一个特定的日期时间,如下所示:

last_check_timestamp = datetime.today() - timedelta(hours = 1)
print last_check_timestamp
>>> last_check_timestamp = 2016-03-14 11:13:06.743626
print type(last_check_timestamp)
>>> type(last_check_timestamp) = <type 'datetime.datetime'>

我想运行一个查询来检索在所述日期时间之后插入的所有行。这就是我正在尝试的方式:

    query_string = ("SELECT * FROM {0} "
                    "WHERE SCN_TO_TIMESTAMP(ORA_ROWSCN) >= '{1}'".\
                    format(db_name, self.last_check_timestamp.timetuple()))
    logger.info("query_string = \n%s\n" % query_string)

所以 Oracle 接收到的查询字符串是这样的:

SELECT * FROM SYS.DUAL
WHERE SCN_TO_TIMESTAMP(ORA_ROWSCN) >= 'time.struct_time(tm_year=2016, tm_mon=3, tm_mday=14, tm_hour=11, tm_min=23, tm_sec=26, tm_wday=0, tm_yday=74, tm_isdst=-1)'

这是我得到的错误:

cx_Oracle.DatabaseError: ORA-01858: a non-numeric character was found where a numeric was expected

为了让 Oracle 接受查询,应该如何进行日期比较?

【问题讨论】:

    标签: python oracle oracle10g cx-oracle


    【解决方案1】:

    除非启用了行依赖,否则最后一个 SCN 存储在数据块级别而不是行级别。为了获得行级别的 SCN 编号,您需要在表的行依赖关系上。

    select * from tablename where SCN_TO_TIMESTAMP(ORA_ROWSCN)='14-MAR-16 02.01.05.000000000 PM';
    

    我相信您以不正确的格式将时间戳传递给 oracle,因为 time.struct_time 不是 oracle 函数

    SELECT * FROM SYS.DUAL
    WHERE SCN_TO_TIMESTAMP(ORA_ROWSCN) >= 'time.struct_time(tm_year=2016, tm_mon=3, tm_mday=14, tm_hour=11, tm_min=23, tm_sec=26, tm_wday=0, tm_yday=74, tm_isdst=-1)'
    

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多