2012-01-17 42 views
65

Đây là mô hình:SQLAlchemy: cách lọc trường ngày?

class User(Base): 
    ... 
    birthday = Column(Date, index=True) #in database it's like '1987-01-17' 
    ... 

Tôi muốn lọc giữa hai ngày, ví dụ để chọn tất cả người dùng trong khoảng thời gian 18-30 năm.

Làm cách nào để triển khai nó với SQLAlchemy?

tôi nghĩ về:

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

# means age >= 24 and age <= 27 

Tôi biết điều này là không đúng, nhưng làm thế nào để làm có đúng không?

Cảm ơn trước!

Trả lời

110

Trong thực tế, câu hỏi của bạn là đúng trừ các lỗi đánh máy: bộ lọc của bạn là không bao gồm tất cả hồ sơ: bạn nên thay đổi <= cho >= và ngược lại:

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') 

Ngoài ra bạn có thể sử dụng between:

qry = DBSession.query(User).filter(User.birthday.between('1985-01-17', '1988-01-17')) 
+9

Btw, thay vì '' 1985-01-17'', bạn cũng có thể sử dụng 'datetime.date (1985, 1, 17)' - có thể dễ dàng hơn trong việc làm việc hoặc làm việc trong một số môi trường. – rippleslash

+1

@rippleslash: bạn đúng, và lý tưởng nhất là sử dụng loại dữ liệu thích hợp cho các tham số. Tuy nhiên, tất cả các cơ sở dữ liệu đều hiểu định dạng ISO 8601 cho các ngày, cũng xảy ra theo thứ tự từ điển. Vì lý do này cho các ví dụ đơn giản, tôi thường sử dụng ngày định dạng ISO - dễ đọc hơn. – van

+1

Các bạn, bạn cũng nên nhớ một điều. KHÔNG đặt ngày vào các dấu ngoặc kép như 'User.birthday <=" 1988-01-17 "' nó sẽ không hoạt động. 'Lỗi:" Giờ cần phải từ 0 đến 23 "' Thay vào đó sử dụng dấu chấm câu như @van nói 'User.birthday <= '1988-01-17'' – pawpaw

0
from app import SQLAlchemyDB as db 

Chance.query.filter(Chance.repo_id==repo_id, 
        Chance.status=="1", 
        db.func.date(Chance.apply_time)<=end, 
        db.func.date(Chance.apply_time)>=start).count() 

nó bằng:

select 
    count(id) 
from 
    Chance 
where 
    repo_id=:repo_id 
    and status='1' 
    and date(apple_time) <= end 
    and date(apple_time) >= start 

điều ước có thể giúp bạn.

Các vấn đề liên quan