比较Python SQLAlchemy中的最新时间戳

时间:2018-12-18 09:52:07

标签: python sql oracle sqlalchemy

我在 Python 中使用了 sqlalchemy 的API。

我有一个字符串,以ISO格式表示日期。我使用datetime.strptime进行转换,如下所示:datetime.strptime(ToActionDateTime, '%Y-%m-%dZ')

现在,我必须比较到该日期的timestamp表的列的值。 转换完初始ISO字符串后,示例结果如下所示2018-12-06 00:00:00。我必须根据日期而不是时间来比较它的相等性,但是我无法正确地做到这一点。任何帮助将不胜感激。

示例Python代码:

ToActionDateTimeObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ')
query = query.filter(db.c.Audit.ActionDateTime <= ToActionDateTimeObj)

编辑:

我也尝试对等式的两个部分都实现cast,但是它也不起作用。当选定的日期与时间戳记的日期匹配时,我无法获得正确的结果。

  from sqlalchemy import Date, cast
  ToActionDateTimeObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ')
  query = query.filter(cast(db.c.Audit.ActionDateTime, Date) <= cast(ToActionDateTimeObj, Date))

1 个答案:

答案 0 :(得分:3)

由于Oracle DATE datatype实际上存储日期和时间,所以强制转换为DATE不会像大多数其他DBMS那样放弃其时间部分的值。相反,函数TRUNC(date [, fmt])仅可用于将值减小到其日期部分。它以单一参数形式截断到最接近的日期,换句话说,使用'DD'作为默认模型:

ToActionDateObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ').date()
...
query = query.filter(func.trunc(db.c.Audit.ActionDateTime) <= ToActionDateObj)

如果使用2参数形式,则precision specifier的日精度为'DDD''DD''J'

但是此解决方案从可能的索引中隐藏了列ActionDateTime。为了使查询索引友好,可将日期ToActionDateObj增加一天,并使用小于号:

ToActionDateObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ').date()
ToActionDateObj += timedelta(days=1)
...
query = query.filter(db.c.Audit.ActionDateTime < ToActionDateObj)