如何在SQL中创建含HH:MM时间字段且满足范围及大小校验的表
解决方案
最优方案:使用数据库原生TIME类型
绝大多数关系型数据库(MySQL、PostgreSQL、Oracle等)都自带TIME类型,天然限制取值范围为00:00:00到23:59:59,不需要额外编写时分的校验规则,只需要补充时间先后的约束即可,建表语句如下(以MySQL为例):
CREATE TABLE X ( H_INI TIME NOT NULL, H_FIN TIME NOT NULL, CONSTRAINT chk_time_order CHECK (H_INI <= H_FIN) );
这种方案后续做时间计算、比较都更方便,是首选方案。
备选方案:强制用字符串存储HH:MM格式
如果业务要求必须存储为字符串类型,可以用VARCHAR(5)存储,通过正则校验限制格式和取值范围,同时补充时间先后约束,示例如下(以MySQL为例):
CREATE TABLE X ( H_INI VARCHAR(5) NOT NULL, H_FIN VARCHAR(5) NOT NULL, -- 校验H_INI格式和取值范围:HH为00-23,MM为00-59 CONSTRAINT chk_hini_valid CHECK (H_INI REGEXP '^([01][0-9]|2[0-3]):[0-5][0-9]$'), -- 校验H_FIN格式和取值范围 CONSTRAINT chk_hfin_valid CHECK (H_FIN REGEXP '^([01][0-9]|2[0-3]):[0-5][0-9]$'), -- 校验开始时间早于等于结束时间(HH:MM格式字符串的字典序与时间顺序一致,可直接比较) CONSTRAINT chk_time_order CHECK (H_INI <= H_FIN) );
原写法问题说明
你原代码中的TO_CHAR(NUMBER(4), 'HH:MM')是错误用法:TO_CHAR是格式转换函数,不能用作字段数据类型定义,无法直接声明字段类型。
内容的提问来源于stack exchange,提问作者user17050892
相关产品推荐
相关产品推荐

