Sim*_*uah 1 python sql sqlalchemy
我正在尝试将以下内容翻译成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 = '')
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
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()
Run Code Online (Sandbox Code Playgroud)
然而,它输出不同的值到上面的SQL查询,我假设是下降到todays_date.month - extract('month', TableA.date) >= 0(其中todays_date.month只是一个日期时间对象)
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
Run Code Online (Sandbox Code Playgroud)
另一方面datediff,SQL服务器的 功能是:
返回指定的startdate和enddate之间交叉的指定datepart边界的计数(有符号整数).
在2016-04和2015-10之间有6个月,所以这将是正确的结果:
datediff(month, '2015-10-10', '2016-04-12')
Run Code Online (Sandbox Code Playgroud)
所以你需要做的是在python中使用sqlalchemy中的正确函数:
from sqlalchemy import func, text
func.datediff(text('month'), TableA.date, todays_date) >= 0
Run Code Online (Sandbox Code Playgroud)
这text('month')是一种将文字SQL传递month给SQL服务器的方法:
In [16]: print(func.datediff(text('month'), datetime.now(), datetime.now()))
datediff(month, :datediff_1, :datediff_2)
Run Code Online (Sandbox Code Playgroud)
literal_column 可能也会起作用.
如果你想要一个更接近的翻译,todays_date在python中替换你在原始中使用的SQL函数:
func.datediff(text('month'), TableA.date, func.getDate()) >= 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3889 次 |
| 最近记录: |