按日期字段

时间:2018-04-04 09:00:25

标签: python postgresql sqlalchemy

来自下表中的数据 Loan_Amendment

    ID     |     Amount     | AddDeduct | AmendDate  
-----------+----------------+-----------+------------
 LT0000160 | 1000.000000000 | 2         | 2018-02-08
 LT0000170 | 1500.00000000  | 1         | 2018-02-10
 LN0000577 | 1000.000000000 | 1         | 2018-03-20
 LN0000587 | 2000.000000000 | 2         | 2018-03-20

我尝试选择总和Amount字段,该字段具有相同年份和月份AmendDate

因此,我尝试在SQLALchemy中选择查询,如下所示:

AmendObj = db.session.query(func.sum(Loan_Amendment.Amount).label('Amount'),
                            Loan_Amendment.AmendDate).\
    group_by(Loan_Amendment.AmendDate).\
    first()

但是,从上面的查询中我尝试过我只能按AmendDate完全相同的日期(年,月,日)进行分组。

更新

我的模型如下所示:

class Loan_Amendment(Object):
    ID              =   db.Column(db.String(13), primary_key=True)
    AddDeduct       =   db.Column(db.String(1))
    Amount          =   db.Column(db.Numeric(25, 9))
    AmendDate       =   db.Column(db.String(20))

目前,我'使用Flask-SQLAlchemy==2.0SQLAlchemy==0.9.9,数据库类型为postgresql

我可以通过AmendDate

中的月份和年份选择总和和分组

1 个答案:

答案 0 :(得分:3)

使用date_trunc()功能将日期截断为月精度:

month = func.date_trunc('month', Loan_Amendment.AmendDate)

AmendObj = db.session.query(func.sum(Loan_Amendment.Amount).label('Amount'),
                            month).\
    group_by(month).\
    first()
    # Did you mean all()?

另一个较少依赖数据库的选项是使用EXTRACT()

from sqlalchemy import extract

AmendObj = db.session.query(func.sum(Loan_Amendment.Amount).label('Amount'),
                            extract('year', Loan_Amendment.AmendDate),
                            extract('month', Loan_Amendment.AmendDate)).\
    group_by(extract('year', Loan_Amendment.AmendDate),
             extract('month', Loan_Amendment.AmendDate)).\
    first()

由于您的日期列实际上是文本,因此您需要先进行强制转换。如果您使用的是具有ColumnElement.cast()快捷方式,1.0.7或更高版本的SQLAlchemy版本,那么只需

func.date_trunc('month', Loan_Amendment.AmendDate.cast(Date))

但如果没有,那么

from sqlalchemy import cast

func.date_trunc('month', cast(Loan_Amendment.AmendDate, Date))

如果使用EXTRACT,自然也是如此。

给出你的模型和数据的一个hacky解决方案就是简单地获取包含年份和月份部分的子字符串并按其分组:

month = func.substr(Loan_Amendment.AmendDate, 1, 7)