SQLAlchemy过滤器将datetime.time转换为datetime.datetime

时间:2020-05-19 16:40:29

标签: python sql-server datetime sqlalchemy

我正在使用SQLAlchemy,在我生命中无法使用它来过滤TIME列而不将其视为DATETIME。

我将类定义为

class v_MyView(Base):
  __table__ = Table('MyView', Base.metadata,
    Column('id', Integer, primary_key=True),
    Column('EntryDateTime', DateTime),
    Column('EntryDate', Date),
    Column('EntryTime', Time),
    ...

如果我这样做

results = db.query(v_MyView).first()
print(results.EntryTime)

我得到datetime.time(15, 30, 22, 560000)的期望值

但是,如果我这样做

results = db.query(v_MyView).filter(v_MyView.EntryTime >= datetime.time(5,0)).first()
print(results.EntryTime)

我遇到错误

[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types time and datetime2 
are incompatible in the greater than or equal to operator. (402) (SQLExecDirectW)

然后看一下生成的查询,

WHERE [v_MyView].[EntryTime] >= ?]
[parameters: (datetime.datetime(1900, 1, 1, 5, 0),)]

检查似乎正确生成的过滤器

right: BindParameter('%(140718484304128 EntryTime)s', datetime.time(5, 0), type_=Time())

我错过了什么还是这是一个错误?

1 个答案:

答案 0 :(得分:1)

此问题已作为SQLAlchemy repo

中的错误被接受

短期解决方案是使用演员表:

from sqlalchemy import cast
query.filter(my_column >= cast(datetime.time(5, 0), TIME))