表结构table1(开始日期,结束日期,费用名称,费用金额)正常一条数据的'天数'是(结束日期-开始日期)有什么办法可以算出所有数据的时间天数和????因为要考虑的是时间有没有重复 ,还要去掉重复值,所以算法比较棘手
如下面的情况是有重复值的,
 20010308,20010312,ss,100
 20010309,20010315,aa,100
 20010314,20010422,cc,200我在线候,等大家好办法

解决方案 »

  1.   

    不理解你,是不是这样?
    SELECT (Max(开始日期)-Min(结束日期))AS 天数 FROM ATable
      

  2.   

    还是这三条数据的例子
     20010308,20010312,ss,100  =5天
     20010309,20010315,aa,100 = 7天
     20010314,20010422,cc,200 = 9天这样算来应该是:5+9+7天,但是不行!!!因为第二条,第三条数据中时间天数据有和第一条数据重复的部分.把这部分减去就对了。其中第二条数据的9至12号与第一天重复应减去4天其中第三条数据的14至15号与第二天重复应减去2天
    所以结果应该是 (5+7+9)-4-2
    大家明白了吧
      

  3.   

    你取开始日期最小,结束日期最大不就搞定了?
    select datediff(day,min(开始日期),max(结束日期)) as 总天数 from yourtable
      

  4.   

    同意 wdsimon(老王)  你取开始日期最小,结束日期最大
    select datediff(day,min(开始日期),max(结束日期)) as 总天数 from yourtable
      

  5.   

    to h2yang(小青): 如果开始2,结束1之间有时间间隔咋办!
      

  6.   

    select Convert(int,max(结束日期)-min(开始日期)) as 天数 from ur table
    where your condition
      

  7.   

    to h2yang(小青): 如果开始2,结束1之间有时间间隔咋办!在我的思踟中,已经解决了这个问题了。
    是我的开始1,开始2,结束1,开始3,结束2,结束3。
    这里要得出的值应该是结束3-开始1。这个例子中,开始2,结束1之间的时间间隔可以不关心。
      

  8.   

    var
        l_DateTime_Start,
        l_DateTime_End: TDateTime;
        l_Int_Days: Integer;
    begin
      with ADOQuery Do
        //首先Odery By StartDate
        l_Int_Days := 0;
        for i := 0 to Recordcount-1 do
        begin
            l_DateTime_Start := FieldValues['StartDate'];
            l_DataTime_End := FieldValues['EndDate'];
            l_Int_Days := l_Int_Days + (l_DateTime_Start - l_DateTime_Start);
            Next;
            if FieldValues['StartDate'] < l_DataTime_End then
                l_Int_Days := l_Int_Days - (l_DataTime_End - StartDate);
        end;
      end;
    End;把相应的字段内容替换,看要得不?
      

  9.   

    h2yang(小青)的方法应该可以,我这还有一个笨办法
    先取出最小和最大的时间,然后得到这个时间段中所有的日期,用一个循环一个一个日期判断数据库中是否包含此日期,如果包含计数器加一,不包含则跳到下一个日期。
      

  10.   

    不错,看了大家的回复真的都很好,小青的思路更是有灵感,不过也许我描述的不是很完整,有的回复会产生误差因为还会出现一种情况就是:时间段是不可能都是连续的,可以断开,虽然是按小青的思路很好,但实际编码我总是找不到感觉。A_ZHU(诸葛祥云) 的办法,好像也会产生数据误差因为代码只控制了二条挨的数据的时间段,可能第三,四条的时间也在第一条的时间段内谢谢大家gzing大家有什么好的办法请继续,分不够再加
      

  11.   

    我的想法,你是先按开始日期ORDER BY,然后循环调每条记录,判断后面一条记录的开始日期跟前面的结束日期相比较,那样不就能实现你所要得啦,代码我想你能自己搞定了吧
      

  12.   

    var
      i:integer;
      定义个变量记录上一条记录的结束时间 s_d
    begin
    query1.close;
    query1.sql.clear;
    query1.sql.add('select * from 你的表 order by 你的开始日期')
    query1.open;
    query1.first;
    i:= i + 计算第一条记录的时间;
    s_d := 结束时间 
    query1.next;
    while not query1.eof do
      bgein
        i := i + 该记录的时间;
        if s_d > 该记录的开始时间
           bgein
              求出该减去的天数
              i := i + 该减去的天数 
           end;
        s_d := 结束时间 
        query.next;
      end;这个是语句加描述,希望你能看的懂,因为这边没有DELPHI,就没有帮你写成代码,呵呵
      

  13.   

    楼上的思路是绝对正确的,按开始日期升序排序,如下:
    开始1,结束1,
    开始2,结束2,
    开始3,结束3,
    开始4,结束4,
    。。
    开始n-1,结束n-1,
    开始n,结束n,如果 结束n-1<开始n,
    因为 开始n<开始n+1(升序排列),开始n<结束n
    所以 结束n-1<所有以后记录,
    又因 结束n-1 以后记录以 开始n最小,
    所以其间若有间隔,开始n-结束n-1=间隔天数那么只要做个循环,对 结束n-1<开始n 的情况取出间隔天数就OK了
      

  14.   

    var
      i:integer;
      s_d:DateTime;//定义个变量记录上一条记录的结束时间 
    begin
    query1.close;
    query1.sql.clear;
    query1.sql.add('select * from 你的表 order by 你的开始日期')
    query1.open;
    query1.first;
    i:= i + 计算第一条记录的天数;
    s_d := 第一条结束时间 
    query1.next;
    while not query1.eof do
      bgein
        i := i + 该记录的天数;
        if s_d > 该记录的开始时间
           bgein
              求出该减去的天数
              i := i - 该减去的天数 
           end;
        s_d := 该记录的结束时间 
        query.next;
      end;最后的I就是你要求出来的天数昨天晚上太忙,可能写的不是太清楚,中间有点小的没写好,现在改了一下在上面,应该很容易理解的,在加上wdsimon(老王)的解说,我想楼主,应该没问题了吧
      

  15.   

    你取开始日期最小,结束日期最大
    select Max(结束日期)-min(开始日期) as 总天数 from yourtable
      

  16.   

    geyobing(银翼天使) 
    的方法不错..