Обсуждение: некорректные даты
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
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
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
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