我有一个包含计划和过去付款的表格,我需要查找同一用户/契约(Contract)在同一周内是否有任何两次收费。
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 的“间隔”转换为 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()
有什么想法吗?
最佳答案
如果您只在 DAY
时需要它(这是默认间隔),那么只需将您的 SQL 重述为:
c2.due_time > ADDDATE(c1.due_time, - 7)
可以用 SA 术语写成:
filter(Charge.due_time > func.ADDDATE(OldCharge.due_time, -7))
如果您需要过滤不同的时间间隔类型(周、月、年),您可能需要编写自定义 SQL Construct 编译器(有关详细信息,请参阅 Custom SQL Constructs and Compilation Extension)。
关于mysql - 服务器端的 SQLAlchemy 日期时间操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540175/