Python Sqlalchemy:过滤几个月的日期

时间:2016-04-12 11:17:25

标签: 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 = '')

到目前为止,我有:

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

1 个答案:

答案 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