Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сравнение дат в триггере / 17 сообщений из 17, страница 1 из 1
17.05.2008, 22:17
    #35318970
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Есть триггер в котром нужно проверить два поля их двух таблиц. В одной, скажем, поле to, во второй - maxdate. Дата храниться в таком формате - 01/01/2008 в обоих полях.

В триггере нужно проверить такое условие. Если to превышает maxdate, то вывод сообщения, откат и т.п..
Ну что-то типа того
IF (one.to > two.maxdate)
THEN
RAISE NOTICE 'Some error'
END IF;

Так вот, как дату то сравнить? Тип у полей date.
...
Рейтинг: 0 / 0
18.05.2008, 13:17
    #35319208
PG84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
авторДата храниться в таком формате - 01/01/2008 в обоих полях.
Смеялсо...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION "public"."function1" () RETURNS integer AS
$body$
DECLARE
  dt1 DATE ;
  dt2 DATE ;
BEGIN
    dt2 := now();
    dt1 := dt2 - '1 hour'::interval;
    if (dt2>dt1) then
        raise notice 'Coool.... ';
    end if;
    return  0 ;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Код: plaintext
1.
2.
3.
4.
select * from function1()
NOTICE:  Coool.... 


 1  rows fetched ( 46  ms)

Что именно не работает?
...
Рейтинг: 0 / 0
18.05.2008, 14:52
    #35319289
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Зачем мне процедура, зачем now()? Я просто хочу в триггере преобразовать даты (с помощью соответствующих функций) в формат, в котором их могу правильно сравнить. В поле одной таблицы храниться максимальная дата, например, 01/01/2009. А в поле другой таблицы юзер указывает свою дату. И мне нужно, чтобы он не мог сохранить объект, если его дата превышает максимально установленную.
...
Рейтинг: 0 / 0
18.05.2008, 15:31
    #35319319
PG84
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
авторЗачем мне процедура, зачем now()?
Мозг, раз Вам лень читать доку я привел вам пример. Вы наверное сильно удивитесь узнав что триггеры это те же функции. Доступ к полям строки осуществляется через new или old. Жаль что Вы этого не могли знать ). Как получить дату из какой-либо строки другой таблицы - читайте мануал.

авторЯ просто хочу в триггере преобразовать даты (с помощью соответствующих функций) в формат, в котором их могу правильно сравнить.
Вы бредите
...
Рейтинг: 0 / 0
18.05.2008, 15:53
    #35319341
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Всё это я знаю. Я просто хотел узнать с помощью каких библиотечных функций можно преобразовать дату из такого формата дд/мм/гггг в формат (в timestamp, например), в котором можно будет их сравнить как даты.
...
Рейтинг: 0 / 0
18.05.2008, 17:34
    #35319386
Степан H.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
с помошью приведения типов

Код: plaintext
1.
IF to::timestamp > maxdate::timestamp THEN
...
...
Рейтинг: 0 / 0
18.05.2008, 18:12
    #35319411
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Вот, вроде бы это то,что нужно. Спасибо, Степан :)
...
Рейтинг: 0 / 0
18.05.2008, 21:50
    #35319592
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
m0zgВот, вроде бы это то,что нужно. Спасибо, Степан :)У вас даты хранятся как строки???
...
Рейтинг: 0 / 0
19.05.2008, 06:56
    #35319782
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
авторУ вас даты хранятся как строки???
+1
...
Рейтинг: 0 / 0
19.05.2008, 06:57
    #35319783
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
хотя вроде написал
авторТип у полей date.
Наверное нужна более высокая точность именно при сравнении :)
...
Рейтинг: 0 / 0
19.05.2008, 11:46
    #35320149
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
ChameLe0nхотя вроде написал
авторТип у полей date.Тогда что за пурга про формат? Автор что-то не домозговал.
...
Рейтинг: 0 / 0
19.05.2008, 13:28
    #35320496
Степан H.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
m0zgВот, вроде бы это то,что нужно. Спасибо, Степан :)

оно то, наверное нужно, только куда нужнее хранить дату в формате date или за надобностью в timestamp а не varchar . Еще очень неплохо почитать что ЕСТЬ для машини ВРЕМЯ.
...
Рейтинг: 0 / 0
20.05.2008, 14:32
    #35323362
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Да, я стормозил, ничего преобразоввывать не нужно, всё и так сравнивается.
Теперь другой вопрос. Вот в одной таблице поле с датой начала показа рекламы, допустим 20/05/2008 и датой конца показа 30/05/2008. В другой таблице есть поле с максимальным кол-вом дней показа (тип int), допустим 20.
И теперь мне нужно проверять, чтобы пользователь не смогу выставить дату общего показа больше, чем кол-во дней. Т.е.
IF(NEW.seconddate > NEW.firstdate + макс_дни_показа)
THEN
RAISE EXCEPTION бла-бла-бла
END IF;

Так можно сделать? Или как вообще проверить то? Т.е. можно но ли прибавить к полю типа date поле типа int и получить нужный результат сравнения?
...
Рейтинг: 0 / 0
20.05.2008, 14:40
    #35323382
m0zg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Т.е. мне нужно чтоб к числу месяца прибавилось значение кол-ва дней и уже после сложения сравнение шло с датами.
...
Рейтинг: 0 / 0
20.05.2008, 15:55
    #35323691
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
m0zgДа, я стормозил, ничего преобразоввывать не нужно, всё и так сравнивается.
Теперь другой вопрос. Вот в одной таблице поле с датой начала показа рекламы, допустим 20/05/2008 и датой конца показа 30/05/2008. В другой таблице есть поле с максимальным кол-вом дней показа (тип int), допустим 20.
И теперь мне нужно проверять, чтобы пользователь не смогу выставить дату общего показа больше, чем кол-во дней. Т.е.
IF(NEW.seconddate > NEW.firstdate + макс_дни_показа)
THEN
RAISE EXCEPTION бла-бла-бла
END IF;

Так можно сделать? Или как вообще проверить то? Т.е. можно но ли прибавить к полю типа date поле типа int и получить нужный результат сравнения?
Не проверял:
Код: plaintext
1.
2.
3.
4.
5.
SELECT max_days INTO integer_max_days FROM your_settings;
IF(NEW.seconddate > NEW.firstdate + integer_max_days)
THEN
    RAISE EXCEPTION бла-бла-бла
END IF;
По мотивам доки .
Может будет нужо кастов добавить.
...
Рейтинг: 0 / 0
28.05.2008, 15:59
    #35340602
tengu_sarutobi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
Код: plaintext
1.
select '2008-05-25' + '1 day'::interval
...
Рейтинг: 0 / 0
28.05.2008, 19:00
    #35341247
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение дат в триггере
m0zgЕсть триггер в котром нужно проверить два поля их двух таблиц. В одной, скажем, поле to, во второй - maxdate. Дата храниться в таком формате - 01/01/2008 в обоих полях.

В триггере нужно проверить такое условие. Если to превышает maxdate, то вывод сообщения, откат и т.п..
Ну что-то типа того
IF (one.to > two.maxdate)
THEN
RAISE NOTICE 'Some error'
END IF;

Так вот, как дату то сравнить? Тип у полей date.


Так берите и сравнивайте, в чем проблемы?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сравнение дат в триггере / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]