Sql 在oracle中,如何创建检查时间是否在10:00:00和21:00:00之间的检查约束?

Sql 在oracle中,如何创建检查时间是否在10:00:00和21:00:00之间的检查约束?,sql,oracle,Sql,Oracle,在Oracle数据库中,我有一个注册日期列。使用SQL,我想添加一个检查约束,检查日期的时间是否在10:00:00和21:00:00之间。 我如何才能做到这一点?您可以使用: check (to_char(datecol, 'HH24:MI') between '10:00' and '21:00')) 注意:这包括'21:00'。使用=和您可以使用检查约束,如下所示: (Your_date - trunc(your_date))*24 between 10 and 21 理想情况下,约束应

在Oracle数据库中,我有一个注册日期列。使用SQL,我想添加一个检查约束,检查日期的时间是否在10:00:00和21:00:00之间。 我如何才能做到这一点?

您可以使用:

check (to_char(datecol, 'HH24:MI') between '10:00' and '21:00'))

注意:这包括
'21:00'
。使用
=
您可以使用
检查约束,如下所示:

(Your_date - trunc(your_date))*24 between 10 and 21

理想情况下,约束应尽可能使用日期-时间(和间隔)表达式和函数。唉,在Oracle中,日期算术主要是与数字(表示“天”)一起工作的,所以您确实需要在某个地方进行转换

我会这样做-未来的开发人员最容易阅读和理解(在我看来):

check (numtodsinterval(reg_date - trunc(reg_date), 'day') 
           between interval '10' hour and interval '21' hour)
trunc(reg_date)
返回日期,一天中的时间截断为午夜。然后
reg\u date-trunc(reg\u date)
返回存储在
reg\u date
中的时间,但结果是一个数字(以天表示)。我使用
numtodsinterval
将其转换为一个间隔,指定该数字表示“天”。剩下的应该是显而易见的


顺便说一下,如果您必须检查一天中的时间是否在10:20和21:20之间,您可以使用相同的方法-使用
间隔10:20小时到分钟
,例如,在
介于
之间的情况下。在这些情况下,以这种方式编写条件的优势(在可读性方面)变得更加明显。

列的确切数据类型是什么?如果要实现业务规则,应该在应用程序层而不是持久性层中执行。通过将其放入数据库,您的应用程序必须捕获一个SQL异常,以了解时间部分是否不可接受,1)这是一个例子,2)这是一个输入数据检查问题,因此应该在接收数据时提前完成,而不是在写入数据时在最后完成。@Bohemian-您所说的很好,但是,除了在数据库中有一个约束之外,还应该这样做,而不是“代替”它。为什么?因为许多进程可以修改存储表中的数据(即使数据总是通过应用程序,而不是直接在表上)。例如,如果开发人员忘记在更新注册日期的新过程中检查一天中的时间,表上的约束将发出红旗,并迫使开发团队在尝试无效更改时立即解决问题(而不是默许)。@Bohemian-如果OP询问触发器,我完全同意。但我认为把它作为一个检查约束来实现并没有什么错。@mathguy只是为了上下文,我曾经是DBA。然后我看到了光明。。。仅仅因为DB可以做这件事,并不意味着他们应该做。在真实的生产环境中,没有特别的更新查询,也没有更新数据的“其他过程”。实际上,除非在极端“紧急”情况下,否则任何手动修改prod数据的人都将被解雇。我会开枪。我还想和平台工程师谈谈,以便更好地锁定人类对数据库的更新访问。将日期/时间转换为字符串是一种代码味道(你知道…堆分配)-为什么不使用
HOUR(datecol)>=10和HOUR(datecol)@Dai。Oracle是否支持
HOUR()
函数?它看起来像Oracle。在这种情况下:
CHECK(EXTRACT(HOUR FROM datecol)>=10和EXTRACT(HOUR FROM datecol)@Dai..Oracle已经支持
EXTRACT()
很久了。这不是您的注释中的内容。而且,您注释中的代码与OP的逻辑不等价。