【问题标题】:SQLAlchemy filter converting datetime.time to datetime.datetimeSQLAlchemy 过滤器将 datetime.time 转换为 datetime.datetime
【发布时间】:2020-09-05 19:52:38
【问题描述】:

我正在使用 SQLAlchemy,并且无法在不将其视为 DATETIME 的情况下过滤 TIME 列。

我将类定义为

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())

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

【问题讨论】:

    标签: python sql-server datetime sqlalchemy


    【解决方案1】:

    这已被接受为SQLAlchemy repo 中的一个错误

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 2021-10-16
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 2016-08-10
      • 2022-06-15
      相关资源
      最近更新 更多