Skip site navigation (1) Skip section navigation (2)

Re: некорр

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 (view raw or flat)
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

In response to

pgsql-ru-general by date

Next:From: sanya-spbDate: 2005-12-22 11:59:05
Subject: plperlu reload external modules
Previous:From: DmitryDate: 2005-12-16 11:50:51
Subject: Re: некорр

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group