Re: How to find first non-vacation day - Mailing list pgsql-general

From Chris Browne
Subject Re: How to find first non-vacation day
Date
Msg-id 603bj0j9c4.fsf@dba2.int.libertyrms.com
Whole thread Raw
In response to How to find first non-vacation day  ("Andrus Moor" <eetasoft@online.ee>)
List pgsql-general
postgresql@philip.pjkh.com (Philip Hallstrom) writes:

>>> I have a table of vacations
>>> create table vacation (
>>> id integer primary key,
>>> dstart date,
>>> dend date );
>>> I need to find first non-vacation day before given date.
>>> This can be done using the following procedural vfp code
>>> function nonvacation( dbefore )
>>> for i=dbefore to  date(1960,1,1) step -1
>>>  select vacation
>>>  locate for between( i, dstart, dend )
>>>  if not found()
>>>    return i
>>>    endif
>>>  endfor
>>> return null
>>> but this is very slow
>>> How to implement this as sql select statement ?
>>
>> Haven't given a lot of thought to this, but why not?
>>
>> SELECT *
>> FROM vacation
>> WHERE
>>    dstart < '2006-02-03'
>> ORDER BY dstart DESC
>> LIMIT 1
>
> Just realized I read the question wrong.  The above would give you the
> first vacation day...
>
> Maybe alter your table to include all days and add a boolean field to
> indicate if it's a vacation day or not?  Then you could probably use
> the above with some tweaks to the where clause.

The "big win" comes if you realize that "vacation," "the whole year,"
"work days," and such are all nicely described as "sets," and that SQL
is fairly excellent at representing set operations.

So create a calendar table that is the set of days  in the year.

Create a vacation table that is the set of vacation days  in the year.

That, combined with indication of other scheduled "non-working days"
such as weekends, can easily define a set of days that are the "work
calendar."

There will be dozens or hundreds of entries in each table; that's
fine, they'll still be small tables, easily searched for
commonality/difference.
--
select 'cbbrowne' || '@' || 'cbbrowne.com';
http://www3.sympatico.ca/cbbrowne/oses.html
"Options to reboot are: -n Avoids the  sync.  It can be used if a disk
or the processor is on fire."  -- reboot(8)

pgsql-general by date:

Previous
From: Chris Browne
Date:
Subject: Re: How to find first non-vacation day
Next
From: Peter Eisentraut
Date:
Subject: Re: Number format problem