flask sqlalchemy 根据日期查询数据库记录

用flask-sqlalchemy以orm模式根据日期查询数据库记录

我数据库mytable中有一个string类型字段pay_date,然后我们需要查询今天的数据记录,正常我们sql语句来做这个事,非常简单,地球人都知道,用DATE()嘛

select * from mytable where DATE(create_date) == '2020-12-08'

然鹅,我们flask-sqlalchemy的orm模式呢:ormModel.query.filter(“xxxx”)
这里面的xxx怎么写,我真是绕了几个弯才出来:

方案1 填充datetime后再丢进去比较

这个方案中我的实际需求是我需要根据起止日期查询数据库记录

# 先传参进来string类型的起、止日期,然后直接丢进查询语句里面
start_date = "2020-12-08 00:00:00"
end_date = "2020-12-08 23:59:59"
record_list = db.session.query(CcbDanbian).filter(CcbDanbian.pay_date.between(start_date , end_date ))).all()

这个方法感觉太low了!

方案2 使用SQL CAST函数

这个方案中我直接查询今日的数据,使用cast函数可以获取datetime字段的date部分,激动!
先看CAST函数介绍:CAST (expression AS data_type)
参数说明:
expression:任何有效的SQServer表达式。
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
用CAST函数进行数据类型转换时,在下列情况下能够被接受:
(1)两个表达式的数据类型完全相同。
(2)两个表达式可隐性转换。
(3)必须显式转换数据类型。

# 先导入sql db对象
start_date = "2020-12-08 00:00:00"
end_date = "2020-12-08"
start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date += " 23:59:59"
end_date = datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")
records = db.session.query(CcbDanbian).filter(or_(and_(db.cast(CcbDanbian.pay_date, db.DATE) <= db.cast(end_date, db.DATE),
                                            db.cast(CcbDanbian.pay_date, db.DATE) >= db.cast(start_date, db.DATE)),
                                       and_(db.cast(CcbDanbian.refund_date, db.DATE) <= db.cast(end_date, db.DATE),
                                            db.cast(CcbDanbian.refund_date, db.DATE) >= db.cast(start_date, db.DATE))
                                       )).all()

方案3 使用SQL EXTRACT函数

# 查询2020年12月8日的数据
ccb_danbian_exist_order = db.session.query(CcbDanbian).filter(
        extract('day', CcbDanbian.pay_date) == 8,
        extract('year', CcbDanbian.pay_date) == 2020,
        extract('month', CcbDanbian.pay_date) == 12,).all()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值