如现在有5个时段T,但具体时间不定,
假设T1: 8:00 ----12:00 T2: 13:00----15:00 T3: 16:00----17:00
T4: 18:00-----20:00 T5: 22:00--23:30
另有个时段X :8:30----14:20
我想得到一组新的时段数组,结果如下:
8:00---8:30 ,13:00----14:20
就是说,我取出新的时段应该是根据X在T时段组中有效的时间,取出来的。
这个比较急的,请大家有空指定一下。
假设T1: 8:00 ----12:00 T2: 13:00----15:00 T3: 16:00----17:00
T4: 18:00-----20:00 T5: 22:00--23:30
另有个时段X :8:30----14:20
我想得到一组新的时段数组,结果如下:
8:00---8:30 ,13:00----14:20
就是说,我取出新的时段应该是根据X在T时段组中有效的时间,取出来的。
这个比较急的,请大家有空指定一下。
array of record
var1
var2
end;
再用For i:=low(T) to high(T) do
分别对X的var1,var2进行比较,
如果X的var1/var2在T[i]中,则替换。
是不是这个意思???///
是有点这个意思的。但是感觉具体的实现起来比较麻烦。
你试一下:
create table #T1(
t1_1 varchar(20) null,
t1_2 varchar(20) null,
t2_1 varchar(20) null,
t2_2 varchar(20) null,
t3_1 varchar(20) null,
t3_2 varchar(20) null,
t4_1 varchar(20) null,
t4_2 varchar(20) null,
t5_1 varchar(20) null,
t5_2 varchar(20) null
)insert into #T1
values ('08:00', '12:00', '13:00', '15:00', '16:00', '17:00', '18:00', '20:00', '22:00', '23:30')declare @pT1 varchar(20), @pT2 varchar(20)
declare @R1 varchar(20), @R2 varchar(20), @R3 varchar(20), @R4 varchar(20)select @pT1='08:30', @pT2='15:20'if exists(select 1 from #T1 where @pT1>t1_1)
select @R1=t1_1, @R2=@pT1
from #T1if exists(select 1 from #T1 where @pT1>t2_1)
select @R1=t2_1, @R2=@pT1
from #T1if exists(select 1 from #T1 where @pT1>t3_1)
select @R1=t3_1, @R2=@pT1
from #T1if exists(select 1 from #T1 where @pT1>t4_1)
select @R1=t4_1, @R2=@pT1
from #T1if exists(select 1 from #T1 where @pT1>t5_1)
select @R1=t5_1, @R2=@pT1
from #T1---
if exists(select 1 from #T1 where @pT2>t1_1)
select @R3=t1_1, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t1_2)
select @R3=t1_2, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t2_1)
select @R3=t2_1, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t2_2)
select @R3=t2_2, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t3_1)
select @R3=t3_1, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t3_2)
select @R3=t3_2, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t4_1)
select @R3=t4_1, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t4_2)
select @R3=t4_2, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t5_1)
select @R3=t5_1, @R4=@pT2
from #T1
if exists(select 1 from #T1 where @pT2>t5_2)
select @R3=t5_2, @R4=@pT2
from #T1
--
select @R1, @R2, @R3, @R4
select * from #T1
drop table #T1
你从数据库里把数据读出来,放进T记录型数组中。在循环比较var1.var2就可以了。
你也可以直接对数据库进行操作。用sql语句进行判断。再对库进行修改。
你自己再等等,说不定有哪位高人有其他的方法。
先谢谢你。我执行试了一下,在正常情况下是可以的,但如果X的时段不是8:30--14:20,
而是 5:00----14:20,那么起始的时段应该是8:30。另外我是希望可以在用Delphi里的数组等操作。不知能否继续帮我想想,谢谢了。
1。定义某段时间的存储方式,例如
TTimeSegment= record
startTime: TDatetime;
stopTime: TDatetime;
end ;
2。定义包含多段时间的时间序列TTimeSegments,它要保证
a。其中的所有的时间段都是严格按序排列的。
b。所有的时间段都已经不可能再进行合并了。
具体是在增加/删除时间段的时候进行操作
3。TTimeSegments提供add和remove方法以便新增和删除时间段,在这个时候,要注意新增和删除时间段都都可能导致原有的时间段的合并或拆分。(建议你先做一个简单的单个时间段之间的add,remove操作的方法,以便整理思路)。当时我大概花了1天多的时间来处理它.good luck!
是啊,好烦啊,这个问题。
哦,真的,是我写错了。是 应该是 8:00---8:30 ,13:00----14:20 。
谢谢西风。有没有好的算法来解决这个问题呢?
呵呵,希望这个问题在明天放假前能解决。
Const
ATimeList:Array[0..4,0..1] of String
=(('08:00','12:00'),('13:00','15:00'),('16:00','17:00'),('18:00','20:00'),('22:00','23:30'));
Var
OutTimeList:Array[0..4,0..1] of String;
BTime,ETime:String;
ii,j:Integer;
begin
BTime:='08:30';
ETime:='14:20';
j:=0;
Memo1.Lines.Clear;
for ii:=0 to 4 do
begin
if (ATimeList[ii,0]>=ETime) or (ATimeList[ii,1]<=BTime) then
Continue
else begin
if ATimeList[ii,0]>BTime then
OutTimeList[j,0]:=ATimeList[ii,0]
else
OutTimeList[j,0]:=BTime; if ATimeList[ii,1]<ETime then
OutTimeList[j,1]:=ATimeList[ii,1]
else
OutTimeList[j,1]:=ETime;
end;
Memo1.Lines.Add(OutTimeList[j,0]+' -- '+OutTimeList[j,1]) ;
j:=j+1;
end;
end;
祝大家新年愉快,万事如意,
年底大红包!!