【问题标题】:Comparing timestamp to date in Python SQLAlchemy在 Python SQLAlchemy 中比较时间戳和日期
【发布时间】:2019-05-18 17:08:20
【问题描述】:

我在 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))

【问题讨论】:

  • 我已经尝试过cast 抱歉忘记提及它。这是行不通的。我还尝试同时投射列和对象,如果我打印投射的对象,我得到的是CAST(:param_1 AS DATE)
  • 帖子已更新。我不明白为什么它不起作用。
  • 我正在使用 Oracle。我的第一个想法是增加 1 天,但我的主管要求我不要使用这种方法。
  • 当我在 Oracle SQL Developer 中转换时间戳时,它只返回像“11-NOV-2018”这样的日期。
  • 它抛出这个:cx_Oracle.DatabaseError: ORA-01899: bad precision specifier 但我不想只比较一天。我需要比较整个日期。

标签: python sql oracle sqlalchemy


【解决方案1】:

由于 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)

【讨论】:

  • 我被要求避免增加一天。我设法解决了这个问题,我只需要等待两天才能将问题标记为已回答,您可以看看它。
  • 如果您想使用ActionDateTime 上的现有索引而不是创建基于函数的索引,那么听到您被问到的原因会很有趣,因为这是正确的解决方案。您自己的解决方案也有同样的问题,即该列隐藏在可能的现有索引中。此外,您不应该真正(人)将日期/日期时间作为文本处理,尤其是当存在诸如 TRUNC() 之类的正确方法时。
  • 我不知道为什么我被要求这样做,我的第一个想法是增加一天,但由于这被拒绝了,我不得不寻找另一种方法。感谢您的回复,您确实向我介绍了我没有考虑到的事情,我使用了您的第一个解决方案,因为它比我的更好,并且缺少索引不会影响我的目标功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2020-08-20
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多