> This is on MySQL with php (both local and the host) and at the moment I have
> Date as the field type as I have no use for the time of day (I'm not
> offering horoscopes).
excellent
so, let's say that you were interested in pulling out everybody from your
database who has a birthday coming up in the next 10 days
the first thing you need to realize is that the solution will not involve
comparing the month and day of the birthday to the month and day of today
this might have been your thinking process in wanting to store separate year,
month, and day columns -- but all you would end up doing is having to combine
them again so that you can do date arithmetic, because you sure as heck don't
want to set up the if/then/else logic (it's a real dog's breakfast) for handling
date ranges over month end boundaries
i'll walk you through it in detail
STEP 1
consider the difference in years between today and your birthday
if you were born earlier in the year than today (e.g. 1969-02-28) then the
difference between 2005 and 1969 is 36
but if you were born later in the year than today (e.g. 1969-09-17) then the
difference between 2005 and 1969 is 36
this might be obvious, but i broke it down just in case ;o)
so, what you do is add the difference back to your birthday
1969-02-28 + 36 years = 2005-02-28
1969-09-17 + 36 years = 2005-09-17
this "moves" your birthday into the current year
STEP 2
compare the "moved" birthday to today by calculating the difference in days
if the difference is between 0 and 10, the person has a birthday coming up in
the next 10 days
so here is the query --
select name, birthdate
from yourtable
where datediff(
date_add(birthdate
, interval year(current_date)
-year(birthdate) year )
, current_date )
between 0 and 10
the reason it's "between 0 and 10" instead of "< 10" is because you will get
negative results from the DATEDIFF
oh, by the way, DATEDIFF works only in 4.1.1, so if you're on an earlier
version, there's another way to do it, using the TO_DAYS() function twice
okay, now for the final wrinkle
STEP 3
if a person's birthday is january 3rd and today is december 28th, the above
query will not work -- remember, we "moved" the birthday into the current year,
so the difference would be a large negative number
so what we have to do is "move" the birthday into the next year, whenever the
birthday occurs earlier in the year than today
we could do this in STEP 1, by adding 1 to the number of years for those
situations, but this would require an "if" test
it's easier just to throw the extra test into the WHERE clause
select name, birthdate
from yourtable
where datediff(
date_add(birthdate
, interval year(current_date)
-year(birthdate) year )
, current_date )
between 0 and 10
or datediff(
date_add(birthdate
, interval year(current_date) + 1
-year(birthdate) year )
, current_date )
between 0 and 10
final thoughts --
you might be wondering why it has to be so complex
let me assure you, the complexity arises *not* from the fact that you have
chosen to implement birthdates in DATE format
it derives entirely from the complexity of our calendar
remember, month-end and year-end boundaries are tricky, and remain so no matter
which database you're using
however, the built-in date functions that each database has will minimize the
complexity
feel free to imagine the additional complexity that you would need if you stored
your birthdates either as unix timestamps (ptui!) or separate year, month, and
day columns
rudy
____ • The WDVL Discussion List from WDVL.COM • ____
To Join wdvltalk, Send An Email To: mailto:[EMAIL PROTECTED] or
use the web interface http://e-newsletters.internet.com/discussionlists.html/
Send Your Posts To: [email protected]
To change subscription settings, add a password or view the web interface:
http://intm-dl.sparklist.com/read/?forum=wdvltalk
________________ http://www.wdvl.com _______________________
You are currently subscribed to wdvltalk as: [email protected]
To unsubscribe send a blank email to [EMAIL PROTECTED]
To unsubscribe via postal mail, please contact us at:
Jupitermedia Corp.
Attn: Discussion List Management
475 Park Avenue South
New York, NY 10016
Please include the email address which you have been contacted with.