On Jun 20, 4:36 am, oggie rob <[EMAIL PROTECTED]> wrote:
> I could be a bit more pythonic:
>
> >>> from django.db.models.query import QOr
> >>> ql = [Q(birthdate__day=(startdate + timedelta(days=x)).day) & 
> >>> Q(birthdate__month=(startdate + timedelta(days=x)).month) for x in 
> >>> range(7)]
> >>> Person.objects.filter(QOr(*ql))
>
>  -rob
>
> On Jun 19, 2:51 pm, Tim Chase <[EMAIL PROTECTED]> wrote:
>
> > > I want to compare dates in my db while ignoring the year field. Lets
> > > say I have a birthday field and want to find upcoming birthdays in the
> > > next one week. How can I achieve this? If I try-
>
> > > last_date = datetime.now().date() + timedelta(days=7)
> > > users = User.objects.filter(birthday__day__lte = last_date.day)
>
> > This is a bit tricky, especially because of boundary conditions
> > like ends-of-months and end-of-years.  Note that if it's
> > currently December 28th, last_date.day isn't quite what you want
> > to be comparing to.
>
> > This can be done on the DB-server-side if you do server-specific
> > code; it can be done on the Django side in homogenous Python code
> > if you're willing to slurp over all your germane birthdays and
> > filter them locally; or, with such a small range of days (fixed
> > at 7), you could do something hackish like:
>
> >   now = datetime.now().date()
> >   dates = [now + timedelta(days=x) for x in xrange(8)]
> >   from operator import or_
> >   params = reduce(or_, [
> >     Q(birthday__day=date.day, birthday__month=date.month)
> >     for date in dates
> >     ])
> >   users = User.objects.filter(*params)
>
> > This gets a little unweildy if you have more than a couple days
> > to consider (I don't think I'd do this for more than about 10
> > days).  It basically builds something of the form
>
> >   ...filter(Q(birthday__day=now.day, birthday__month=now.month) |
> >     Q(birthday__day=now.day + timedelta(days=1),
> >       birthday__month=now.month + timedelta(days=1)) |
> >     Q(birthday__day=now.day + timedelta(days=2),
> >       birthday__month=now.month + timedelta(days=2)) |
> >     Q(birthday__day=now.day + timedelta(days=3),
> >       birthday__month=now.month + timedelta(days=3)) |
> >     ...
>
> > for each of your days.  (thus a cap on 7 days is good...smaller
> > is better)
>
> > However, the alternative on the server side would be to write
> > DB-specific code doing some crazy date math using functions like
> > MySQL's DateAdd function.  The high-level picture would involve
> > normalizing the field's date to the year that falls within the
> > given range and then comparing it with BETWEEN to ensure it falls
> > between the two calculated dates.  Something like this 100%
> > untested code:
>
> >    now = datetime.now().date()
> >    end = now + timedelta(days=7)
> >    users = User.objects.extra(where="""
> >      adddate(birthday, interval
> >        (Extract(year from %s) - Extract(year from birthday))
> >        years)
> >        BETWEEN %s AND %s
> >      """,
> >      params = [now, now, end])
>
> > You might have to tweak it to add 1 to the year if there's some
> > odd boundary straddling.

Thanks folks. I will go with the db-neutral pythonic approach.

Ram


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to