| From: | "Alexander M(dot) Pravking" <fduch(at)antar(dot)bryansk(dot)ru> |
|---|---|
| To: | pgsql-ru-general(at)postgresql(dot)org |
| Subject: | Re: некорр |
| Date: | 2005-12-16 12:21:54 |
| Message-ID: | 20051216122154.GR38660@dyatel.antar.bryansk.ru |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-ru-general |
On Fri, Dec 16, 2005 at 02:50:51PM +0300, Dmitry wrote:
> простой пример.
> у вас форма на сайте, где юзверь указывает дату.
> хоть даже простая форма вывода отчетов за период, где указывается год,
> месяц, число.
> кто не даст криворукому указать 31 число в том месяце, где его нет.
Если считать, что год и месяц юзверь всегда указывает корректно, то
навскидку вот такая функция:
CREATE OR REPLACE FUNCTION date_or_last_in_month(integer, integer, integer)
RETURNS date AS '
DECLARE
y ALIAS FOR $1;
m ALIAS FOR $2;
d ALIAS FOR $3;
res date;
last_day integer;
BEGIN
res := ''0001-01-01 AD''::date
+ (y-1) * ''1y''::interval
+ (m-1) * ''1mon''::interval;
last_day := extract(day from (res + ''1mon''::interval)::date - 1);
IF (d > last_day) THEN
res := res + (last_day - 1);
ELSE
res := res + (d - 1);
END IF;
RETURN res;
END' LANGUAGE 'plPgSQL';
fduch(at)~=# SELECT date_or_last_in_month(2005, 12, 30);
date_or_last_in_month
-----------------------
2005-12-30
(1 row)
fduch(at)~=# SELECT date_or_last_in_month(2005, 2, 30);
date_or_last_in_month
-----------------------
2005-02-28
(1 row)
Функцию можно написать и на SQL, но она будет более громоздкая и менее
понятная, хотя, возможно, пошустрее.
--
Fduch M. Pravking
| From | Date | Subject | |
|---|---|---|---|
| Next Message | 2005-12-22 11:59:05 | plperlu reload external modules | |
| Previous Message | Dmitry | 2005-12-16 11:50:51 | Re: некорр |