сравнить дату на PLSQL - PullRequest
       28

сравнить дату на PLSQL

0 голосов
/ 25 ноября 2018

Мне нужно создать триггер, который выдает ошибку, если я пытаюсь удалить из таблицы, а дата в таблице равна sysdate.

Это мой код:

create or replace trigger nonViolation
  before insert or delete on reservation
  for each row
declare 
  error exception;
  error2 exception;
  dateres date:=sysdate;
begin
  if inserting then
     if :new.dateDep<dateres then 
         raise error;
     end if;
  end if;

  if deleting then
     if (:OLD.datedep=dateres)
     then 
        raise error2;
     end if;
  end if;

exception
  when error2 then
    raise_application_error(-20003,'supression impossible');
  when error then 
    raise_application_error(-20001,'reservation impossible');
end;

Я попытался удалить строку, содержащую сегодняшний date 25-nov-18, и триггер не работает.Я попытался напечатать значения :old.datedep и dateres, и они совпадают:

25-nov-2018
25-nov-2018

Может кто-нибудь помочь мне?спасибо

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

В столбцах Oracle и переменных типа DATE есть компонент даты (год-месяц-день) плюс компонент времени (часы за 24 часа, минуты, секунды).
То, как вы «видите» на экране, зависит от инструмента разработкии локальная конфигурация инструмента.
некоторые инструменты, если компонент времени - полночь (00:00:00), не отображают компонент времени.
Также ваша страна / регион сеанса влияет на то, как инструмент отображает даты.
Функция TRUNC над значением типа DATE без второго параметра дает значение типа DATE, время компонента которого - полночь (00:00:00).

Таким образом, для сравнения 2 значений одного дня использования:

Trunc(:old.datedep)=trunc(dateres) 
0 голосов
/ 25 ноября 2018

Я подозреваю, что вы не учитываете тот факт, что SYSDATE содержит текущее время, а также текущую дату.Возможно, ваш триггер даст желаемый результат, если вы удалите элемент времени, подобный следующему:

    ...
    error2 exception;
    dateres date := trunc(sysdate);
begin
    ...

«это не работает»

Как подсказывает @bobjarvisвам может понадобиться убрать элемент времени из datedep (в зависимости от того, как вы его заполняете):

if TRUNC(:OLD.datedep) = dateres

Попробуйте использовать полную маску формата даты, например 'yyyy-mm-dd hh24:mi:ss', и посмотрите, что у вас есть на самом деле.

...