Re: Need help with db script, and daily routines - Mailing list pgsql-general

From Richard Huxton
Subject Re: Need help with db script, and daily routines
Date
Msg-id 46277FF5.2000906@archonet.com
Whole thread Raw
In response to Need help with db script, and daily routines  ("Peter Neu" <peter.neu@gmx.net>)
List pgsql-general
Peter Neu wrote:
> Hello,
>
> I have 2 tables:
>
> In one I log the user name of a web site user like this:
>
> Name               Access time
> "makost0001"   " 2007-04-19 15:09:19"
> "makost0001"   " 2007-04-19 15:09:19"
>
> In the other I have the user name his group and the expiry date of his
> account.
>
> Name              Group               Expiry date
> "makost0001"      "book"             "2013-04-05 09:41:25.357677"
>
> When the user accesses the web site for the first time I need to change the
> expiry date
> to   < today > + 3 years.
>
> Problem is I need to do this on a regular basis once a day to avoid table
> locks. And also how do I tell the program to find the earliest access time
> of a user?  Like shown above there a multiple
> entries for the same time & user because of the multiple requests. :o(
>
> Should I have a field in the first table like <ignore this entry forever>
> when an expiry date is already set?
>
> I'm pretty new to db programming and especially to PostgreSQL. Can somebody
> please help?

Once a day, just do something like this:

UPDATE user_expiry_dates
SET expiry_date = CURRENT_DATE + '3 years'::interval
WHERE user_name IN (
   SELECT user_name
   FROM access_logs
   GROUP BY user_name
   HAVING min(access_time) BETWEEN (CURRENT_DATE - '1 day'::interval)
AND CURRENT_DATE)
);

However, if your expiry date was null before the user has visited the
site you might find it more efficient to do:

UPDATE user_expiry_dates
SET expiry_date = CURRENT_DATE + '3 years'::interval
WHERE
   expiry_date IS NULL
   AND user_name IN (
     SELECT user_name
     FROM access_logs
     HAVING access_time BETWEEN (CURRENT_DATE - '1 day'::interval) AND
CURRENT_DATE)
);

Here we don't care if this user has logged in 100 times before today, we
only update the expiry_date if it's NULL.

HTH
--
   Richard Huxton
   Archonet Ltd

pgsql-general by date:

Previous
From: "Martin Gainty"
Date:
Subject: Re: How often do I need to reindex tables?
Next
From: Tony Caduto
Date:
Subject: Re: Postgres data/form entry tool