Flask---SQLAlchemy中从datetime字段获取某月份的数据

本文介绍在Flask项目中,如何使用SQLAlchemy按月份汇总数据库中的历史记录。提供了两种方法,一种是通过计算月份的第一天和最后一天,使用between进行筛选;另一种更推荐的方法是利用extract函数直接查询指定年月的数据。

需求:

在使用Flask开发项目,需要按月份进行汇总,在数据库的历史记录中,我使用了datetime记录日期和时间,那么如何获取某月份的所有数据呢?

第一种方法:

一种方法是先获取那个月份的第一天和最后一天的datetime,再使用between,例如:

# 基于Flask的SQLAlchemy

# models
class History(db.Model):
    __tablename__ = 'historys'
    id = db.Column(db.Integer, primary_key=True)
    date= db.Column(db.Date)
# firstDay:某年某月的第一天,datetime类型
# lastDay:某年某月的最后一天,datetime类型
historys = History.query.filter(History.date.between(firstDay, lastDay)).all()

关于获取某月份的第一天和最后一天,可以参考这里

def getMonthFirstDayAndLastDay(year=None, month=None):
    """
    :param year: 年份,默认是本年,可传int或str类型
    :param month: 月份,默认是本月,可传int或str类型
    :return: firstDay: 当月的第一天,datetime.date类型
              lastDay: 当月的最后一天,datetime.date类型
    """
    if year:
        year = int(year)
    else:
        year = datetime.date.today().year

    if month:
        month = int(month)
    else:
        month = datetime.date.today().month

    # 获取当月第一天的星期和当月的总天数
    firstDayWeekDay, monthRange = calendar.monthrange(year, month)

    # 获取当月的第一天
    firstDay = datetime.date(year=year, month=month, day=1)
    lastDay = datetime.date(year=year, month=month, day=monthRange)

    return firstDay, lastDay

 

第二种方法(更好,推荐):

第一种方法其实是笨了一点,但是还可以用。后来我思考能不能不用between,不然还要计算某月的第一天和最后一天。后来查阅资料发现有更好的查询方法。

这个方法要使用extract函数,这个函数可以从datetime字段中分解出年月。不过在flask_sqlalchemy中没有extract,所以只能从sqlalchemy包导入。

from sqlalchemy import extract

之后只需要这么写,就可以获取某月份的所有数据了

# 获取12月份的所有数据
historys = History.query.filter(extract('month', History.date) == 12).all()

但是用上面的查询会把往年的12月也查询出来,那么就加上年份的查询

from sqlalchemy import extract, and_

historys = History.query.filter(and_(
    extract('year', History.date) == 2016,
    extract('month', History.date) == 12
).all()

自此,2016年12月份的所有记录就可以查询出来了。

 

参考资料:

https://blog.youkuaiyun.com/huoyuan_zh/article/details/7322160

 

转载于:https://www.cnblogs.com/Paul-watermelon/articles/9970418.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值