Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:如何过滤日期字段?_Python_Sql_Database_Orm_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy:如何过滤日期字段?

Python SQLAlchemy:如何过滤日期字段?,python,sql,database,orm,sqlalchemy,Python,Sql,Database,Orm,Sqlalchemy,以下是模型: class User(Base): ... birthday = Column(Date, index=True) #in database it's like '1987-01-17' ... 我想在两个日期之间进行筛选,例如选择18-30年内的所有用户 如何使用SQLAlchemy实现它 我想到: query = DBSession.query(User).filter( and_(User.birthday >= '1988-01-

以下是模型:

class User(Base):
    ...
    birthday = Column(Date, index=True)   #in database it's like '1987-01-17'
    ...
我想在两个日期之间进行筛选,例如选择18-30年内的所有用户

如何使用SQLAlchemy实现它

我想到:

query = DBSession.query(User).filter(
    and_(User.birthday >= '1988-01-17', User.birthday <= '1985-01-17')
) 

# means age >= 24 and age <= 27
query=DBSession.query(用户).filter(

和(User.birth>='1988-01-17',User.birth=24和age事实上,您的查询是正确的,除了输入错误:您的筛选器排除了所有记录:您应该更改
=
,反之亦然:

qry = DBSession.query(User).filter(
        and_(User.birthday <= '1988-01-17', User.birthday >= '1985-01-17'))
# or same:
qry = DBSession.query(User).filter(User.birthday <= '1988-01-17').\
        filter(User.birthday >= '1985-01-17')
从应用程序导入SQLAlchemyDB作为db
Chance.query.filter(Chance.repo\u id==repo\u id,
Chance.status==“1”,
db.func.date(Chance.apply_time)=start.count()
它等于:

select
   count(id)
from
   Chance
where
   repo_id=:repo_id 
   and status='1'
   and date(apple_time) <= end
   and date(apple_time) >= start
选择
计数(id)
从…起
机会
哪里
回购id=:回购id
和status='1'
和日期(苹果时间)=开始

愿望可以帮助你。

如果你想得到整个时期:

    from sqlalchemy import and_, func

    query = DBSession.query(User).filter(and_(func.date(User.birthday) >= '1985-01-17'),\
                                              func.date(User.birthday) <= '1988-01-17'))
来自sqlalchemy导入和uz,func
query=DBSession.query(User.filter)和(函数日期(User.birth)>=1985-01-17)\

函数日期(用户生日)顺便说一句,您也可以使用
datetime.date(1985,1,17)代替
'1985-01-17'
-在某些环境中可能更容易获取或使用。@RippleFlash:你是对的,理想情况下应该使用适当的数据类型作为参数。但是,所有数据库也都理解ISO 8601格式的日期,这也恰好是字典顺序。出于这个原因,对于简单的示例,我通常使用ISO格式的日期-更容易阅读。危险:虽然这对某些人来说可能很明显-这只是因为
func.date
确实对列进行了强制转换,从而从等式中删除了时间=>这并不意味着时间范围!这只在时间不在列中时起作用-您必须像这样强制转换为日期,或者一旦列为DateTim,就将其转换为日期e或timestamp-通常在00:00结束(MySQL和PostgreSQL都会这样做)。更通用的解决方案不是强制转换,而是设置发送到它的日期。endOfDay()因此实际上将
1988-01-17 23:59:59
发送到数据库比较:)
select
   count(id)
from
   Chance
where
   repo_id=:repo_id 
   and status='1'
   and date(apple_time) <= end
   and date(apple_time) >= start
    from sqlalchemy import and_, func

    query = DBSession.query(User).filter(and_(func.date(User.birthday) >= '1985-01-17'),\
                                              func.date(User.birthday) <= '1988-01-17'))