Mysql 服务器端的SQLAlchemy日期时间操作

Mysql 服务器端的SQLAlchemy日期时间操作,mysql,sqlalchemy,Mysql,Sqlalchemy,我有一个表,其中列出了计划付款和过去付款,我需要查找同一周内是否有针对同一用户/合同的任何两项费用 select count(*) from charge as c1, charge as c2 where c1.id_contract = c2.id_contract and c1.status = 'SUCCESS' and c2.status in ('SUCCESS', 'PENDING', 'WAITING') and c1.id > c2.id and c2

我有一个表,其中列出了计划付款和过去付款,我需要查找同一周内是否有针对同一用户/合同的任何两项费用

select count(*) from charge as c1, charge as c2 
where c1.id_contract = c2.id_contract 
  and c1.status = 'SUCCESS' 
  and c2.status in ('SUCCESS', 'PENDING', 'WAITING') 
  and c1.id > c2.id and c2.due_time > (c1.due_time - interval 7 day);
我很难在sqlalchemy中重现这个查询,主要是因为我找不到如何将MySQL的“interval”转换为数据库无关形式的sqlalchemy

到目前为止,我提出了这个,它转换了所有内容,但时间间隔:

db.session.query(Charge, OldCharge).filter(Charge.id_contract == OldCharge.id_contract, Charge.status=='WAITING', OldCharge.status.in_(('SUCCESS', 'PENDING')), Charge.id > OldCharge.id).count()

有什么想法吗?

如果您只需要在
s(默认时间间隔)内使用它,那么只需将SQL作为:

c2.due_time > ADDDATE(c1.due_time, - 7)
可以用SA术语写成:

filter(Charge.due_time > func.ADDDATE(OldCharge.due_time, -7))

如果需要筛选不同的间隔类型(周、月、年),则可能需要编写自定义SQL构造编译器(有关详细信息,请参阅)。

如果仅在
天(默认间隔)需要此编译器,则只需将SQL作为:

c2.due_time > ADDDATE(c1.due_time, - 7)
可以用SA术语写成:

filter(Charge.due_time > func.ADDDATE(OldCharge.due_time, -7))

如果需要筛选不同的间隔类型(周、月、年),则可能需要编写一个自定义SQL构造编译器(有关详细信息,请参阅)。

因此,我最后编写了一个自定义日期_diff()表达式:

class date_diff(expression.FunctionElement):
    type = Integer()
    name = 'age'

@compiles(date_diff, 'default')
def _default_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )
@compiles(date_diff, 'mysql')
def _my_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )

@compiles(date_diff, 'sqlite')
def _sl_date_diff(element, compiler, **kw):    # pragma: no cover
    return "julianday(%s) - julianday(%s)" % (compiler.process(element.clauses.clauses[0]),
                                              compiler.process(element.clauses.clauses[1]),
                                              )

因此,我最终编写了一个自定义日期_diff()表达式:

class date_diff(expression.FunctionElement):
    type = Integer()
    name = 'age'

@compiles(date_diff, 'default')
def _default_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )
@compiles(date_diff, 'mysql')
def _my_date_diff(element, compiler, **kw):  # pragma: no cover
    return "DATEDIFF(%s, %s)" % (compiler.process(element.clauses.clauses[0]),
                                 compiler.process(element.clauses.clauses[1]),
                                 )

@compiles(date_diff, 'sqlite')
def _sl_date_diff(element, compiler, **kw):    # pragma: no cover
    return "julianday(%s) - julianday(%s)" % (compiler.process(element.clauses.clauses[0]),
                                              compiler.process(element.clauses.clauses[1]),
                                              )