如现在有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时段组中有效的时间,取出来的。
这个比较急的,请大家有空指定一下。

解决方案 »

  1.   

    T为
    array of record
      var1
      var2
    end;
    再用For i:=low(T) to high(T) do
    分别对X的var1,var2进行比较,
    如果X的var1/var2在T[i]中,则替换。
    是不是这个意思???///
      

  2.   

    TO  laiwei791(大卫) :
        是有点这个意思的。但是感觉具体的实现起来比较麻烦。
      

  3.   

    没有蛮理解你的意思。
    你试一下:
    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
      

  4.   

    不是很麻烦。
    你从数据库里把数据读出来,放进T记录型数组中。在循环比较var1.var2就可以了。
    你也可以直接对数据库进行操作。用sql语句进行判断。再对库进行修改。
    你自己再等等,说不定有哪位高人有其他的方法。
      

  5.   

    to zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之):
      先谢谢你。我执行试了一下,在正常情况下是可以的,但如果X的时段不是8:30--14:20,
    而是 5:00----14:20,那么起始的时段应该是8:30。另外我是希望可以在用Delphi里的数组等操作。不知能否继续帮我想想,谢谢了。
      

  6.   

    这个问题我也曾经碰到过。我当时的思路是这样的:
    1。定义某段时间的存储方式,例如
    TTimeSegment= record
      startTime: TDatetime;
      stopTime: TDatetime;
    end ;
    2。定义包含多段时间的时间序列TTimeSegments,它要保证
    a。其中的所有的时间段都是严格按序排列的。
    b。所有的时间段都已经不可能再进行合并了。
    具体是在增加/删除时间段的时候进行操作
    3。TTimeSegments提供add和remove方法以便新增和删除时间段,在这个时候,要注意新增和删除时间段都都可能导致原有的时间段的合并或拆分。(建议你先做一个简单的单个时间段之间的add,remove操作的方法,以便整理思路)。当时我大概花了1天多的时间来处理它.good luck!
      

  7.   

    to  yyfhz(火山):
       是啊,好烦啊,这个问题。
      

  8.   

    to  dyf2001(西风) 
      哦,真的,是我写错了。是 应该是 8:00---8:30 ,13:00----14:20 。
    谢谢西风。有没有好的算法来解决这个问题呢?
    呵呵,希望这个问题在明天放假前能解决。
      

  9.   

    添加一个Memoprocedure TForm1.Button1Click(Sender: TObject);
    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;
      

  10.   

    谢谢各位 ,尤其谢谢 xhh_88(三友) ,zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之),dyf2001(西风) (是你帮我指出了错误 ^_^)等等。
    祝大家新年愉快,万事如意,
          年底大红包!!