oracle - SQL Developer 中列的检查约束

标签 oracle check-constraint

我需要创建一个表,其中“ttime”列的值可以在 10:0022:00。这是代码:

create table test (    
  ttime date,
  CONSTRAINT CHECK_ttime CHECK(ttime >= TO_DATE('10:00', 'HH24:MI') AND
                               ttime <= TO_DATE('22:00', 'HH24:MI'))
);

但是当我创建这个表的时候,出现了一个错误:

ORA-02436: date or system variable wrongly specified in CHECK constraint

如何避免?有什么问题?

最佳答案

要实现这样的约束,您需要从 ttime 列中提取时间。当您将日期的时间部分(在此处表示为字符串文字 '10:00')转换为 DATE 数据类型的值时,日期部分默认为第一个当前月份和年份的日期,因此 TO_DATE('10:00', 'HH24:MI') 将导致 01/05/2017 10:00:00你的情况变成了

ttime >= 01/05/2017 10:00:00 and  ttime <= 01/05/2017 22:00:00 

注意:AND应替换为ORttime 不能小于某个值,同时又要大于该值。

话虽如此,作为选项之一,您可以按如下方式定义约束:

constraint t1_chk01 check (to_number(to_char(c1, 'HH24MI')) 
                           between 1000 and 2200)

关于oracle - SQL Developer 中列的检查约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44107709/

相关文章:

sql - Oracle 中的 DATEDIFF 函数

sql - Oracle错误: ORA-01839: date not valid for month specified

postgresql - PostgreSQL 列上的字符串格式约束不起作用

sql - 如何在 SQL 中编写允许一系列字符串或空白值的 CHECK 约束?

sql-server - 为什么 sp_rename 不适用于 CHECK 约束?

sql - CHECK 约束不起作用

sql - 向oracle查询添加 'distinct'关键字会无故抹杀查询性能

oracle - 有关触发器的帮助

sql - 如何优化在具有700M行的Oracle表上运行的更新SQL

sql - T SQL CHECK 允许大写值集的约束