এসকিউএলএলকেমি: কীভাবে ফিল্টার করবেন ডেট ফিল্ড?


105

এখানে মডেল:

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

আমি দুটি তারিখের মধ্যে ফিল্টার করতে চাই, উদাহরণস্বরূপ 18-30 বছরের ব্যবধানে সমস্ত ব্যবহারকারী বেছে নেওয়া।

কীভাবে এটি এসকিউএএলএলচেমির মাধ্যমে বাস্তবায়ন করবেন?

আমি মনে করি:

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

# means age >= 24 and age <= 27

আমি জানি এটি সঠিক নয়, তবে কীভাবে সঠিক করবেন?

উত্তর:


181

আসলে, আপনার ক্যোয়ারী টাইপো ব্যতীত সঠিক: আপনার ফিল্টারটি সমস্ত রেকর্ড বাদ দিচ্ছে: আপনার <=জন্য >=এবং এর বিপরীতে পরিবর্তন করা উচিত :

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

এছাড়াও আপনি ব্যবহার করতে পারেন between:

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

28
বিটিডব্লিউ এর পরিবর্তে '1985-01-17', আপনি এটি ব্যবহার করতে পারেন datetime.date(1985, 1, 17)- কিছু পরিবেশে কাজ করা বা তার সাথে কাজ করা আরও সহজ হতে পারে।
22'15 এ টসবিট করুন

5
@ রিপ্লেস্ল্যাশ: আপনি ঠিক বলেছেন এবং আদর্শভাবে প্যারামিটারগুলির জন্য সঠিক ডেটা টাইপ ব্যবহার করা উচিত। যাইহোক সমস্ত ডেটাবেসগুলি তারিখগুলির জন্য আইএসও 8601 ফর্ম্যাটটিও বোঝে, যা অভিধানিক ক্রম হিসাবেও ঘটে। সাধারণ উদাহরণগুলির জন্য এই কারণে আমি সাধারণত আইএসও ফর্ম্যাটড তারিখগুলি ব্যবহার করি - পড়তে সহজ।
ভ্যান

4
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()

এটি সমান:

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

ইচ্ছা আপনাকে সাহায্য করতে পারে।


3

আপনি যদি পুরো সময়টি পেতে চান :

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

এর অর্থ পরিসীমা: 1985-01-17 00:00 - 1988-01-17 23:59


সাবধানবাণী: যদিও এই কিছু সুস্পষ্ট হতে পারে - এই শুধুমাত্র কাজ করে কারণ func.dateনেই CAST কলামে যা সমীকরণ সময়ে সরিয়ে ফেলা হবে => এই আছে না সঙ্গে গড় পরিসীমা সময়! এটি কেবল তখনই কাজ করে যখন সময় কলামে না থাকে - আপনাকে অবশ্যই এটি ডেট করতে হবে, বা কলামটি তারিখ তৈরি করতে হবে, একবার এটি ডেটটাইম বা টাইমস্ট্যাম্প - এটি সাধারণত 00:00 দিয়ে শেষ হয় (মাইএসকিউএল এবং পোস্টগ্রিএসকিউএল উভয়ই এটি করে)। আরো জেনেরিক সমাধান ঢালাই না, কিন্তু কোন তারিখে আপনি এটা .endOfDay () থেকে পাঠাচ্ছেন সেট করতে তাই বাস্তবে আপনি পাঠান 1988-01-17 23:59:59ডাটাবেসের সাথে তুলনা :)
jave.web
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.