Thread: некорректные даты

некорректные даты

From
Dmitry
Date:
Hi.

Может вопрос банальный, но ответа не нашел.
Как в PG можно средствами базы корректировать сабжы?

например:
test=# select date '2005-02-30';
ERROR:  date/time field value out of range: "2005-02-30"
test=# select date '2005-02-28';
    date
------------
 2005-02-28
(1 row)

На сколько я помню мускул автоматом приводит такие даты к корректному виду.
Какие есть методы для PG?
Или писать свою функцию?

--
WBR, Dmitry. DWL-RIPE. http://dewil.ru/contact


Re: некорр

From
"Alexander M. Pravking"
Date:
On Fri, Dec 16, 2005 at 01:44:14PM +0300, Dmitry wrote:
> Может вопрос банальный, но ответа не нашел.
> Как в PG можно средствами базы корректировать сабжы?
>
> например:
> test=# select date '2005-02-30';
> ERROR:  date/time field value out of range: "2005-02-30"
> test=# select date '2005-02-28';
>    date
> ------------
> 2005-02-28
> (1 row)
>
> На сколько я помню мускул автоматом приводит такие даты к корректному виду.

Сомнительное преимущество - ведь не узнаешь, корректная на самом деле
дата или нет.

> Какие есть методы для PG?

Встречный вопрос: откуда, собственно, берутся эти некорректные даты?

PG'шная арифметика над датами/таймштампами, на мой взгляд, вообще
сказочная. Если такая некорректность возникает в результате вычислений,
то проще делать их средствами самого PG.



--
Fduch M. Pravking

Re: некорр

From
Dmitry
Date:
Alexander M. Pravking wrote:
> On Fri, Dec 16, 2005 at 01:44:14PM +0300, Dmitry wrote:
>
>> например:
>> test=# select date '2005-02-30';
>> ERROR:  date/time field value out of range: "2005-02-30"
>>
>>
> Сомнительное преимущество - ведь не узнаешь, корректная на самом деле
> дата или нет.
>
30 февраля явно не корректная.
я больше склонен привести ее к корректному дню того же месяца.
>
>> Какие есть методы для PG?
>>
>
> Встречный вопрос: откуда, собственно, берутся эти некорректные даты?
>
простой пример.
у вас форма на сайте, где юзверь указывает дату.
хоть даже простая форма вывода отчетов за период, где указывается год,
месяц, число.
кто не даст криворукому указать 31 число в том месяце, где его нет.

обычно в таких случаях я проводил коррекцию на веб-серверном ПО. а если
это вынести в базу, будет правильней имхо.

> PG'шная арифметика над датами/таймштампами, на мой взгляд, вообще
> сказочная.
согласен. мне очень нравятся механизмы, которые есть в PG для работы с
датами.

>  Если такая некорректность возникает в результате вычислений,
> то проще делать их средствами самого PG.
>
некорректность может появиться только от внешнего источника, при поиске
или insert.


--
WBR, Dmitry. DWL-RIPE. http://dewil.ru/contact


Re: некорр

From
"Alexander M. Pravking"
Date:
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