Обсуждение: OT: using column in an interval

Поиск
Список
Период
Сортировка

OT: using column in an interval

От
Bradley Kieser
Дата:
All,

I know that this isn't strictly an admin question but please forgive me
for asking.
I am writing a (admin) job which does a select off a PG database based
on three columns:

last_backup: timestamp
backup_unit: integer - Represents day, week, quarter, annual, etc. The
text is stored in backup_code (e.g. 'days', 'months')
backup_period: integer - Represents the skip factor.

i.e. if backup_unit is 1 (days) and period is 3, then together they
represent "every three days".

Obviously I want to do something like:

select id, client
from backupSchedule
where last_backup + interval backup_period backup_code <= CURRENT_DATE


However, interval seems to only take text such as
inverval '3 days'

and I get an error even with this:

select id, client
from backupSchedule
where last_backup + interval backup_period::text || backup_code <=
CURRENT_DATE

Can someone please point me to the right statement to use for
column-based interval arithmetic?
The docs all give hardcoded text strings in examples. Not found one yet
with a proper column-based query!


Re: OT: using column in an interval

От
Stephan Szabo
Дата:
On Thu, 23 Mar 2006, Bradley Kieser wrote:

> All,
>
> I know that this isn't strictly an admin question but please forgive me
> for asking.
> I am writing a (admin) job which does a select off a PG database based
> on three columns:
>
> last_backup: timestamp
> backup_unit: integer - Represents day, week, quarter, annual, etc. The
> text is stored in backup_code (e.g. 'days', 'months')
> backup_period: integer - Represents the skip factor.
>
> i.e. if backup_unit is 1 (days) and period is 3, then together they
> represent "every three days".
>
> Obviously I want to do something like:
>
> select id, client
> from backupSchedule
> where last_backup + interval backup_period backup_code <= CURRENT_DATE
>
>
> However, interval seems to only take text such as
> inverval '3 days'
>
> and I get an error even with this:
>
> select id, client
> from backupSchedule
> where last_backup + interval backup_period::text || backup_code <=
> CURRENT_DATE
>
> Can someone please point me to the right statement to use for
> column-based interval arithmetic?
> The docs all give hardcoded text strings in examples. Not found one yet
> with a proper column-based query!

Well, that's because the interval <blah> syntax is for interval literals.

CAST( backup_period || ' ' || backup_code AS interval) should give you an
interval. If the units were constant, I'd say that using integer *
interval is a better idea, but I think you'd need a function that say took
backup_unit and gave back an interval of 1 <unit> to make that work, but
that would possibly be cleaner overall.


Re: OT: using column in an interval

От
Tom Lane
Дата:
Stephan Szabo <sszabo@megazone.bigpanda.com> writes:
> On Thu, 23 Mar 2006, Bradley Kieser wrote:
>> last_backup: timestamp
>> backup_unit: integer - Represents day, week, quarter, annual, etc. The
>> text is stored in backup_code (e.g. 'days', 'months')
>> backup_period: integer - Represents the skip factor.

> CAST( backup_period || ' ' || backup_code AS interval) should give you an
> interval. If the units were constant, I'd say that using integer *
> interval is a better idea, but I think you'd need a function that say took
> backup_unit and gave back an interval of 1 <unit> to make that work, but
> that would possibly be cleaner overall.

This really seems like a case of a poorly chosen representation.  Why
not just have the backup interval as an interval column, ie

last_backup: timestamptz (not timestamp, btw)
backup_interval: interval, can be eg '3 days' or '1 month' or whatever.

Then you can do

WHERE last_backup + backup_interval <= current_timestamp

            regards, tom lane