我试图将以下内容翻译成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) >= 0
(其中todays_date.month
只是一个日期时间对象)
答案 0 :(得分:7)
todays_date.month - extract('month', TableA.date) >= 0
之间的差异超过一年, TableA.date
可能无法达到您想要的效果,例如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的作用是:
返回指定的startdate和enddate之间交叉的指定日期部分边界的计数(有符号整数)。
2016-04至2015-10之间有6个月,所以这将是正确的结果:
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 month
传递给SQL服务器的方法:
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