pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Jan Wieck <JanWieck@Yahoo.com>
To: Bruno Wolff III <bruno@wolff.to>
Cc: Michael Agbaglo <byteshifter@shifted-bytes.de>
Cc: josh@agliodbs.com
Cc: pgsql-sql@postgresql.org
Subject: Re: how to sort a birthday list ?
Date: Fri, 21 Jun 2002 09:22:27 -0400
Message-ID: <3D132893.8D0CBF55@Yahoo.com> (raw)
References: <3D122508.70104@shifted-bytes.de>
	<200206201703.52435.josh@agliodbs.com>
	<3D12E43E.3090307@shifted-bytes.de>
	<20020621123919.GA11968@wolff.to>

Bruno Wolff III wrote:
> 
> On Fri, Jun 21, 2002 at 10:30:54 +0200,
>   Michael Agbaglo <byteshifter@shifted-bytes.de> wrote:
> >
> > of course you could sort by DOY but then you'll have a problem w/ the
> > next year:
> >
> > if it's let's say december and you select the list for the next 60 days,
> > persons having birthday in december will appear after persons having
> > birthday in january.
> >
> > I tried to use CASE WHEN... THEN in ORDER BY but it doesn't seem to work
> > (syntax error at '')
> 
> You also need to worry about leap years. If a birthday is February 29
> and there isn't one this year, what do you want to happen?

You can create a little PL/pgSQL function like this:

CREATE FUNCTION next_birthday(date) RETURNS date AS '
DECLARE 
    p_dob       ALIAS FOR $1;
    v_age       integer;
    v_birthday  date;
BEGIN
    -- First we get the age in years
    v_age := EXTRACT (YEAR FROM CURRENT_DATE) - 
             EXTRACT (YEAR FROM p_dob);

    -- We add that to the DOB to get this years birthday
    v_birthday := p_dob + (v_age::text || '' years'')::interval;

    -- If that is in the past, we add another year
    IF v_birthday < CURRENT_DATE THEN
        v_birthday := v_birthday + ''1 year''::interval;
    END IF;

    RETURN v_birthday;
END;'
LANGUAGE plpgsql;

It just calculates the next birthday of a person relative from today.
Then query with

SELECT next_birthday(birthday), name
    FROM person ORDER BY 1;


Jan

-- 

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #



view thread (7+ messages)

Message-ID: <3D132893.8D0CBF55@Yahoo.com>
Permalink:  ../3D132893.8D0CBF55@Yahoo.com/
Also on:    postgresql.org/message-id/3D132893.8D0CBF55@Yahoo.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: JanWieck@Yahoo.com, bruno@wolff.to, byteshifter@shifted-bytes.de, josh@agliodbs.com
  Subject: Re: how to sort a birthday list ?
  In-Reply-To: <3D132893.8D0CBF55@Yahoo.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox