Re: некорр
От | Alexander M. Pravking |
---|---|
Тема | Re: некорр |
Дата | |
Msg-id | 20051216122154.GR38660@dyatel.antar.bryansk.ru обсуждение исходный текст |
Ответ на | Re: некорр (Dmitry <dwl_pgsql@dewil.ru>) |
Список | 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@~=# SELECT date_or_last_in_month(2005, 12, 30); date_or_last_in_month ----------------------- 2005-12-30 (1 row) fduch@~=# SELECT date_or_last_in_month(2005, 2, 30); date_or_last_in_month ----------------------- 2005-02-28 (1 row) Функцию можно написать и на SQL, но она будет более громоздкая и менее понятная, хотя, возможно, пошустрее. -- Fduch M. Pravking
В списке pgsql-ru-general по дате отправления: