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]),
)