2014-02-21 38 views
0

我们有一个外汇定价系统,我们需要表示在给定的一周中某一天+时间内活动的一组ECN /交易所。因此可以将开始时间,结束时间和ECN名称表示为一个行。组合主键将是开始时间+结束时间+ ECN。例如。 -MTWThF- 08:00伦敦,-MTWThF- 14:30纽约,EBS。现在不能有重叠或重复。人们可以编辑记录并且约束应该保留。在关系数据模型中表示时间表/时间表

如何最好地在数据库级别表示此?如果它有助于我们使用Oracle,但是Oracle不可知的解决方案是首选。

现在忽略时区&夏令时,使它无法避免重叠。

回答

1

我会给出两个答案,首先考虑RFC 5545的重复规则格式,并在应用层进行验证。

由于这可能不是您正在寻找的答案,因此我还建议查看本周的任何一点作为从周开始的偏移量。

然后,您可以建立一个转换列表,这些转换列表定义了交易所打开或关闭的周内的偏移量。所需的唯一约束是验证偏移量是否有效(少于7天),并且开放到闭合的转换只是紧跟在后面的转换(反之亦然)。

我没有一个Oracle对话框打开在打转转,但这里是在T-SQL的例子:

create table #sched (exchangeID int, weekOffset int, isOpen bit) 
insert into #sched 
values (1, 400, 1), 
    (1, 800, 0), 
    (1, 1200, 1), 
    (1, 1700, 0); 

-- constraints are that isOpen cannot be repeated. 1->0->1 is valid, 1->1->0 is not 

declare @coffset int, 
    @weekStart datetime; 

set @weekstart = dateadd(week, datediff(week, 0, getdate()), 0); 
set @coffset = datediff(minute, @weekStart, getdate()); 

with trans (uniqid, exch, offset, isopen) 
as 
(
    select ROW_NUMBER() OVER (ORDER BY weekoffset), * 
    from (
     SELECT exchangeID, weekoffset - 7*24*60 as weekoffset, isopen from #sched 
     UNION 
     select exchangeID, weekoffset, isopen from #sched 
     UNION 
     select exchangeID, weekoffset + 7*24*60, isopen from #sched 
    ) as inr 
) 
select *, 
    CASE pt.IsOpen 
     WHEN 1 THEN 'Exchange is now open and will close at ' + CAST(DATEADD(minute, nt.offset, @weekstart) as varchar(20)) 
     ELSE 'Exchange is now closed and will open at ' + CAST(DATEADD(minute, nt.offset, @weekstart) as varchar(20)) END 
from (
    SELECT MIN(uniqid) as nextTransition 
    FROM trans 
    WHERE offset > @coffset 
) as n 
cross join (
    SELECT MAX(uniqid) as prevTransition 
    FROM trans 
    WHERE offset <= @coffset 
) as p 
inner join trans as nt on nt.uniqid = nextTransition 
inner join trans as pt on pt.uniqid = prevTransition 

drop table #sched 

Results上sqlfiddle:

| NEXTTRANSITION | PREVTRANSITION | UNIQID | EXCH | OFFSET | ISOPEN |             COLUMN_10 | 
|----------------|----------------|--------|------|--------|--------|-------------------------------------------------------------| 
|    9 |    8 |  9 | 1 | 10480 |  1 | Exchange is now closed and will open at Feb 24 2014 6:40AM |