Python Sqlalchemy:按月份的日期过滤

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只是一个日期时间对象)

Ilj*_*ilä 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
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)

  • @tarun 数据库错误。这是针对 Microsoft SQL Server 的,您使用的是 MariaDB/MySQL。 (2认同)