我创建了一个简单的表格:
CREATE TABLE Messages
( msgID number(10) PRIMARY KEY,
sender_ID number(10),
time_sent TIMESTAMP,
);
现在我想为它添加一个约束,以确保发送的时间将在2014年之后。我写道:
alter table Messages
add constraint year_check
check (time_sent > to_timestamp('2014-12-31 23:59:59'));
但是我收到以下错误:
ORA-30075:TIME / TIMESTAMP WITH TIME ZONE文字必须在CHECK约束中指定
我不想在我的时间戳中设置TIME ZONE并插入如下值:
INSERT INTO Messages VALUES(1, 1, TIMESTAMP '2014-12-24 07:15:57');
如何修复我的约束以使此错误消失?
答案 0 :(得分:1)
当您查找错误消息in the manual时,您会看到建议:
操作:仅将时间或时间戳用于时区文字。
to_timestamp('2014-12-31 23:59:59')
返回timestamp
(没有时区),但Oracle在检查约束中需要timezone with time zone
(尽管我不得不承认我不理解为什么)
您可以使用已解析为timestamp with time zone
的ANSI时间戳文字:
alter table Messages
add constraint year_check
check (time_sent > timestamp '2014-12-31 23:59:59');
或使用具有明确时区的to_timestamp_tz
:
alter table Messages
add constraint year_check
check (time_sent > to_timestamp_tz('2014-12-31 23:59:59 +00:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM'));
顺便说一下:我宁愿在1月1日更改条件以使用>=
:
alter table Messages
add constraint year_check
check (time_sent >= timestamp '2015-01-01 00:00:00');
否则,您可以添加2014-12-31 23:59:59.567
答案 1 :(得分:0)
尝试使用格式掩码:
select to_timestamp('2014-12-31 23:59:59') timest from dual
2 /
select to_timestamp('2014-12-31 23:59:59') timest from dual
*
ERROR at line 1:
ORA-01843: not a valid month
select to_timestamp('2014-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS') timest from dual
2 /
TIMEST
---------------------------------------------------------------------------
31-DEC-14 11.59.59.000000000 PM