Jack Lauman <[EMAIL PROTECTED]> wrote on 02/04/2005 11:57:37 AM:

> I want to run a nightly cron job where you iterate throught each row of 
> a single table and reset a field depending on the conditions specified. 
>   In this case I want to take a date field (RenewalDate) and compare it 
> to the current date less a 30 day grace period and if true reset the 
> (SubscriptionEpired) field to a 1 (true).
> 
> RenewalDate >=(${now} - 30) SubscriptionExpired = 1
> 
> Both fields are in a single table called Restaurants
> 
> RenewalDate date (yyyy-mm-dd)
> SubscriptionExpired int(1)
> 
> Will something like this work or do I need something different?
> 
> UPDATE Restaurant SET SubscriptionExpired = 1 WHERE TO_DAYS(NOW) - 
> TO_DAYS(RenewalDate) < 30;
> 
> Thanks,
> 
> Jack
> 
> 

Yes, that would do what you want but because you have a function on the 
left side of an = in your WHERE clause, you eliminate the possibility to 
use an index on that field. You might try rewriting your statement this 
way:

UPDATE Restaurant 
SET SubscriptionExpired = 1
WHERE RenewalDate < (CURDATE() - 30 Days);

It would probably use an index and finish much faster. However, if you 
have a timestamp field, that statement will cause your timestamp to reset 
for each already expired record, too (because you are resetting all of the 
"old" records to 1, even if they are already expired). What you can do to 
limit which timestamps are updated is to limit your changes to only those 
rows that need changing like this:

UPDATE Restaurant 
SET SubscriptionExpired = 1
WHERE RenewalDate < (CURDATE() - 30 Days)
        AND SubscriptionExpired = 0;

That may work even faster because it's more selective. "Your mileage may 
vary" (YMMV).

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine


Reply via email to