如何在PLSQL中检查时间是否大于或小于另一个时间

时间:2015-10-24 15:37:23

标签: oracle syntax plsql date-comparison database-trigger

我正在尝试检查我的触发器,如果​​表TUTPRAC包含CLASSTIME < '9AM' OR > '6PM'中的插入记录。如果这是真的,则更新该记录,并将某些字段更改为NULL

CREATE TRIGGER CheckBeforeAfterHours
BEFORE INSERT OR UPDATE OF CLASS_TIME ON TUTPRAC
FOR EACH ROW
BEGIN
  IF (:NEW.CLASS_TIME < '09:00' OR > '18:00') THEN
     :NEW.STAFFNO := NULL;
     :NEW.CLASS_DAY := NULL;
     :NEW.CLASS_TYPE := NULL;
     :NEW.ROOMNUM := NULL;
  END IF;
END CheckBeforeAfterHours;

TUTPRAC表的列:

CLASSID (PK), UNITCODE, STAFFNO, CLASSDAY, CLASSTIME, CLASSTYPE, ROOMNUM

字段CLASSTIME设置为varchar(5)

我使用Oracle SQLDeveloper

问题

我的问题是,当我尝试运行触发器时,我一直收到此错误:

Error(2,36):
PLS-00103: Encountered the symbol ">" when expecting one of the following:
    ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier>
    <a bind variable> continue avg count current exists max min prior sql stddev
    sum variance execute forall merge time timestamp interval
    date <a string literal with character set specification>
    <a number> <a single-quoted SQL string> pipe
    <an alternatively-quoted string literal with character set specification>
    <an alternatively

2 个答案:

答案 0 :(得分:2)

正确的语法是:

IF (:NEW.CLASS_TIME < '09:00' OR :NEW.CLASS_TIME > '18:00') THEN

答案 1 :(得分:2)

这里有两个问题:

  

IF(:NEW.CLASS_TIME&lt; '09:00'OR&gt; '18:00')

语法不正确。您还需要在 OR 条件中提及:NEW.CLASS_TIME

  

字段“CLASSTIME”设置为varchar(5)

然后你应该进行数字比较而不是字符串比较。字符串比较基于固定格式,它基于 ASCII 值进行比较,而不是纯数字。

假设您通过5:00而不是05:00,即格式未修复时,则比较将提供不同的输出,因为 ASCII 值会有所不同

SQL> SELECT ascii('05:00'), ascii('5:00') FROM dual;

ASCII('05:00') ASCII('5:00')
-------------- -------------
            48            53

<强>设置

SQL> CREATE TABLE t(A VARCHAR2(5));

Table created.

SQL> INSERT INTO t VALUES('04:00');

1 row created.

SQL> INSERT INTO t VALUES('05:00');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM t;

A
-----
04:00
05:00

字符串比较

SQL> SELECT * FROM t WHERE a < '5:00';

A
-----
04:00
05:00

SQL> SELECT * FROM t WHERE a < '05:00';

A
-----
04:00

那么上面发生了什么? '05:00''5:00'不相同。为了避免这种混淆,最好进行数值比较。

SQL> SELECT * FROM t WHERE TO_NUMBER(SUBSTR(a, 2, 1)) < 5;

A
-----
04:00

SUBSTR 会提取数字部分, TO_NUMBER 会将其显式转换为数字。