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