需求:
在使用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.csdn.net/huoyuan_zh/article/details/7322160