2012-09-22 42 views
1

我有一個包含計劃和過去付款的表,我需要查找是否在同一個用戶/合同的同一周內有兩筆費用。服務器端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.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() 

任何想法?

回答

4

所以,我結束了編寫自定義date_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]), 
              ) 
4

如果需要此僅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)。

+0

我已經寫了一個新的表達方式,但無論如何感謝。 –

相關問題