首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle 10 SQL -如何在约束中使用"00:00“时间格式

Oracle 10 SQL -如何在约束中使用"00:00“时间格式
EN

Stack Overflow用户
提问于 2013-10-24 04:06:38
回答 2查看 744关注 0票数 1

使用Oracle 10 SQL的小入门级问题。我正在创建一个具有“日期”类型的列的表,该列应该保存如下所示的值:"00:00“。我有一个约束,检查从00:00到23:00之间的时间。

现在,我不能完全理解的是如何处理这个问题。我确实觉得我错过了一些很基本的东西,但我不太明白.

我是否:

( 1)提取并检查约束内的日期?如果是的话,有没有办法做到这一点?我是否可以插入如下的数据:TO_DATE(‘13-8月-66 12:56',’DD-MON:MI‘),并在约束中使用某种“提取”函数?

2)有关的练习确实提到该特定栏的日期类型。默认情况下,我假设它不占用时间,需要使用alter_session进行修改?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-24 04:16:48

约束只执行限制。它不能修改数据。BEFORE INSERT触发器可以修改数据,但通常比约束效率低。

如果您想要创建一个约束,以确保时间组件总是午夜

代码语言:javascript
复制
CREATE TABLE table_name (
  col DATE CHECK( col1 = TRUNC( col ))
);

如果您想要创建一个修改数据的触发器

代码语言:javascript
复制
CREATE OR REPLACE TRIGGER trg_trunc_dt
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.date_column := TRUNC( :new.date_column );
END;

DATE总是包含一个日期和一个时间组件。您的客户端可能显示或不显示任何组件。许多客户端将使用隐式数据类型转换,在这种情况下,会话的NLS_DATE_FORMAT控制如何将DATE转换为VARCHAR2,以及将哪些元素合并到字符串中。

票数 2
EN

Stack Overflow用户

发布于 2013-10-24 06:14:25

日期类型总是有日期部分和时间部分。它只是一个值,因此没有格式化。例如,如果您显示时间为22:50或10:50,则由您决定。您可以使用to_char(mydate)来依赖您的设置,或者指定格式to_char(mydate,‘mi 24:mi’)。

这就是说,您可以简单地使用列的时间部分而忽略日期部分。如果要避免对存储不同日期的混淆,可以使用触发器将日期部分设置为01.01.0001,例如:

代码语言:javascript
复制
create or replace Trigger trg_datetable_datepart
before insert or update of mydate on datetable
for each row
begin
  :new.mydate := to_date( '01.01.0001 ' || to_char(:new.mydate, 'hh24:mi') , 'dd.mm.yyyy hh24:mi' );
end;

为了避免在23h之后插入时间,您需要编写一个check约束:

代码语言:javascript
复制
alter table datetable add constraint check_datetable_timepart check ( to_char(mydate, 'hh24:mi') <= '23:00' );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19556726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档