gpt4 book ai didi

Python SQL 炼金术 : Filter by datediff of months

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:41 25 4
gpt4 key购买 nike

我正在尝试将以下内容翻译成 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 只是一个日期时间对象)

最佳答案

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做的是:

Returns the count (signed integer) of the specified datepart boundaries crossed between the specified startdate and enddate.

2016 年 4 月和 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 也可能有效。

如果您想要更接近的翻译,请替换 todays_date在 python 中使用您在原始版本中使用的 SQL 函数:

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

关于Python SQL 炼金术 : Filter by datediff of months,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36571706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com