SQL - 时间戳查询

时间:2018-03-10 18:53:09

标签: sql oracle

我正在尝试在GP数据库中创建一个条件,我必须只能插入等于或大于今天日期的约会。

查询:

CREATE TABLE Appointment_Table(
AppointmentID Number(6) NOT NULL Primary Key,
DateAndTime Timestamp(0) NOT NULL,
Check (DateAndTime >= (SYSDATE, 'MM-DD-YYYY HH24:MI:SS')));

这是我得到的错误:

  

ORA-01797:此运算符必须后跟ANY或ALL

非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:5)

数据类型date足以存储日,小时,分钟和秒。无需timestamp。此外,primary key免费为您提供not null,因此无需指定。{/ p>

使用触发器而不是检查约束,因为Oracle在sysdate中不允许check(现在是时间)。

create table a (
  id    number(6) primary key,
  d     date      not null
);

create or replace trigger t_a_ins before insert on a
for each row when ( new.d < sysdate )
begin raise_application_error( -20000, 'Forbidden!'); end;
/

insert into a values (1, sysdate+1);
insert into a values (2, sysdate-1);

第一个插入没问题。

第二个导致错误ORA-20000: Forbidden!。选择-20000和-20999之间的数字来定义您自己的ORA错误。

答案 1 :(得分:2)

解决此问题的一种方法是在表格上放置一个填充了当前日期/时间的字段,然后使用检查约束检查“当前日期和时间”字段。我们称之为新字段ADD_DATE。所以你的桌子就变成了:

CREATE TABLE Appointment_Table
 (AppointmentID        Number(6)
    NOT NULL
    Primary Key,
  DateAndTime          Timestamp(0)
    NOT NULL,
  ADD_DATE             DATE
    DEFAULT SYSDATE
    NOT NULL,
  CONSTRAINT APPOINTMENT_TABLE_CK1
    CHECK(DateAndTime >= ADD_DATE));

See this SQLFiddle

请注意,如SQLFiddle中所示,您不需要为ADD_DATE提供值,或者甚至在INSERT中提及它。在INSERT语句中省略列时,将应用SYSDATE的缺省值。所以在SQLFiddle中,使用的INSERT语句只提到APPOINTMENTID和DATEANDTIME:

INSERT INTO APPOINTMENT_TABLE (APPOINTMENTID, DATEANDTIME)
  VALUES (1, TO_DATE('01-MAY-2017 08:30:00', 'DD-MON-YYYY HH24:MI:SS'));

INSERT INTO APPOINTMENT_TABLE (APPOINTMENTID, DATEANDTIME)
  VALUES (2, TO_DATE('01-MAY-2018 17:30:00', 'DD-MON-YYYY HH24:MI:SS'));

执行上述语句后,表格如下:

APPOINTMENTID   DATEANDTIME             ADD_DATE
1               2018-05-01 08:30:00.0   2018-03-11T03:15:00Z
2               2018-05-01 17:30:00.0   2018-03-11T03:15:00Z

如果您将其中一个DateAndTime值更改为2017而不是2018,然后执行该语句,您将收到类似于

的错误
ORA-02290: check constraint (USER_4_85DBA.APPOINTMENT_TABLE_CK1) violated

这表明约束正在按预期工作。

祝你好运。