2016-04-12 18 views
1

のDateDiff関数でフィルタリング私はSQLAlchemyのに次を翻訳しようとしている: PythonのSQLAlchemyの:ヶ月

SELECT COUNT(TableA.id) AS 'number_of_staff' 
FROM TableA 
WHERE datediff(month, TableA.Date, getDate()) >= 0 
     AND lookup_TableB = '4' 
     AND (TableA.End_Date IS NULL OR TableA.End_Date = '') 

これまでのところ、私が持っている:

get_tablea_number = self.db_session.query(func.count(TableA.id)).\ 
     filter(TableA.lookup_TableB == property_id, 
       todays_date.month - extract('month', TableA.date) >= 0, 
       or_(TableA.end_date == None, 
        TableA.end_date == '')).scalar() 

それは上記に異なる値を出力ししかし、私が推測しているSQLクエリはtodays_date.month - extract('month', TableA.date) >= 0todays_date.monthはdatetimeオブジェクトです)

+0

? – jarlh

答えて

6

prob 「今日」と​​との間の差異が1年を超える場合、あなたが望むことはしないでください。 2016から04と2015から10(ここでは類似のpython)での結果:

In [8]: today = date.today() # datetime.date(2016, 4, 12) 

In [9]: a_date = date(2015,10,10) 

In [10]: today.month - a_date.month 
Out[10]: -6 

一方何datediff function of SQL serverがすることです:指定した日付要素の境界の数(符号付き整数)を返します

指定された開始日と終了日の間で交差します。

6ヶ月は、それがために正しい結果になるので、2016から04と2015から10の間にあります。

datediff(month, '2015-10-10', '2016-04-12') 

それでは、あなたがしなければならないことは、Pythonで正しい関数を使用していますSQLAlchemyのと同様:

from sqlalchemy import func, text 

func.datediff(text('month'), TableA.date, todays_date) >= 0 

text('month')は、SQLサーバーへのリテラルSQL monthを渡す方法です:

In [16]: print(func.datediff(text('month'), datetime.now(), datetime.now())) 
datediff(month, :datediff_1, :datediff_2) 

literal_columnも同様です。

あなたが近づく翻訳をしたい場合は、あなたが元に使用されるSQL関数をPythonでtodays_dateを置き換える:

func.datediff(text('month'), TableA.date, func.getDate()) >= 0 

P.S.

はしないでください。代わりに

TableA.end_date == None 

:あなたが使用しているDBMS

TableA.end_date.is_(None) 
+0

素晴らしい答え、おかげで束! –

関連する問題