表结构table1(开始日期,结束日期,费用名称,费用金额)正常一条数据的'天数'是(结束日期-开始日期)有什么办法可以算出所有数据的时间天数和????因为要考虑的是时间有没有重复 ,还要去掉重复值,所以算法比较棘手
如下面的情况是有重复值的,
20010308,20010312,ss,100
20010309,20010315,aa,100
20010314,20010422,cc,200我在线候,等大家好办法
如下面的情况是有重复值的,
20010308,20010312,ss,100
20010309,20010315,aa,100
20010314,20010422,cc,200我在线候,等大家好办法
SELECT (Max(开始日期)-Min(结束日期))AS 天数 FROM ATable
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
大家明白了吧
select datediff(day,min(开始日期),max(结束日期)) as 总天数 from yourtable
select datediff(day,min(开始日期),max(结束日期)) as 总天数 from yourtable
where your condition
是我的开始1,开始2,结束1,开始3,结束2,结束3。
这里要得出的值应该是结束3-开始1。这个例子中,开始2,结束1之间的时间间隔可以不关心。
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;把相应的字段内容替换,看要得不?
先取出最小和最大的时间,然后得到这个时间段中所有的日期,用一个循环一个一个日期判断数据库中是否包含此日期,如果包含计数器加一,不包含则跳到下一个日期。
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,就没有帮你写成代码,呵呵
开始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了
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(老王)的解说,我想楼主,应该没问题了吧
select Max(结束日期)-min(开始日期) as 总天数 from yourtable
的方法不错..