2012-03-22 46 views
0

我目前拥有的数据库的设计有两个不同的表,它们包含我需要的信息,以表示其中一个表内的特定字段。使用外键定义持续时间的SQL语句

create table EventInfo (
    id   serial NOT NULL CHECK (id > 0), 
    title  LongNameValue NOT NULL, 
    startingTime timestamp, 
    duration 
    primary key (id), 
    foreign key (e_id) references Event(id) 
); 

create table Events (
    id   serial, 
    endTime timestamp, 
    primary key (id), 
}; 

我的问题是,

是有可能有一个在duration场从endTime - startingtime计算?另外,你会如何去做这件事?我正在考虑使用interval。任何帮助,将不胜感激!

+1

你正在使用什么数据库?此外,请发布您尝试过的查询 – 2012-03-22 08:32:25

+0

为什么要制作两张表?根据你的两张表,我认为你只能创建一张表,这就够了。只需将endTime添加到EventInfo。你制作两张桌子的任何特殊原因? – 2012-03-22 08:34:17

+0

*为什么*是不同表格中的开始和结束时间?如果有两个具有不同开始时间的'EventInfo'行,对于单个'Events'行,它甚至意味着什么? – 2012-03-22 08:35:29

回答

0

计算列只能从同一张表的列中生成。

它不可能有两个不同的表

+0

好吧,*可*和*应*不同,但我听到你的声音。你可以在PostgreSQL中做到这一点,但性能会有点烦人。 – 2012-09-27 01:25:08

1

当你设计你的数据库,你应该牢记,只有原始的标准化的数据应该在对表。

当您将“计算”数据存储在表中时,可能会出现不一致情况。

计算的数据应该进入视图,过程或应用程序级别。

说,如果我是你,我把结束时间EventInfo表,并建立与计算时间列的视图。

0

你可以看功能来做到这一点。如果您:

CREATE FUNCTION duration("EventInfo") RETURNS interval LANGUAGE SQL AS 
    $$ SELECT .... $$; 

然后,您可以:

SELECT e.duration FROM "EventInfo" e; 

它将按预期工作。