Brian C. Doyle <doyleb@corp.earthlink.net> wrote:
> I am working on a function to determine the date of the first saturday of
> the month.
>
> Currently I have:
>
> CREATE FUNCTION first_saturday(date)
> RETURNS date
> AS '
> Select CASE WHEN date_part(\'dow\',\'$1\'::DATE)=0 THEN date(\'$1\')+6
> WHEN date_part(\'dow\',\'$1\'::DATE)=1 THEN date(\'$1\')+5
> WHEN date_part(\'dow\',\'$1\'::DATE)=2 THEN date(\'$1\')+4
> WHEN date_part(\'dow\',\'$1\'::DATE)=3 THEN date(\'$1\')+3
> WHEN date_part(\'dow\',\'$1\'::DATE)=4 THEN date(\'$1\')+2
> WHEN date_part(\'dow\',\'$1\'::DATE)=5 THEN date(\'$1\')+1
> WHEN date_part(\'dow\',\'$1\'::DATE)=6 THEN date(\'$1\')+0
> END'LANGUAGE 'sql'
>
> I get an error that $1 is not a valid date. But I want that to be the
> variable I enter...
> what Am I doing wrong???
Hi,Brian.
It doesn't need the meta character \' that you write on both sides
of $1, so you get the error.
By the way, I think the following query is one of what you want.
CREATE FUNCTION first_saturday(date)
RETURNS date
AS '
SELECT (month.firstday
+ ((6 - date_part(''dow'', month.firstday))::text || '' day''
)::interval
)::date
FROM (select ($1::timestamp
- ((date_part(''day'', $1::timestamp)-1)::text
|| '' day''
)::interval
) AS firstday
) AS month
' LANGUAGE 'sql'
;
ex.
# select first_saturday('2001/9/28'::date);
first_saturday
----------------
2001-09-01
# select first_saturday('2001/10/28'::date);
first_saturday
----------------
2001-10-06
# select first_saturday('1999/9/28'::date);
first_saturday
----------------
1999-09-04
# select first_saturday('2010/9/28'::date);
first_saturday
----------------
2010-09-04
Regards.
------------------
Masaru Sugawara
rk73@echna.ne.jp