比如'2003-01-01'和'2003-05-05'咋样设计含数可能得出任意两个日期的差值result := '相差 0年4月4天’?
请大家帮帮忙了,万分感谢
请大家帮帮忙了,万分感谢
解决方案 »
- 我想在Form_Close事件中用Initialization节却出现“Statement expected but 'INITIALIZATION' found”错误
- 50分求教!怎么不让已经删除的数据显示出来!
- 高手大哥们,小弟问一个简单问题,关于检测系统是否已经安装某软件问题
- 请问一个fastreport中的设置问题???
- 简单的问题 -- 怎样调用外部程序
- 十万火急,如何将结构开始赋空
- 太奇怪了!非高高手不能解决!(分这么少,不好意思)
- 求救!关于Delphi6程序的打包问题?报“类没有注册”的错误
- 大虾,谈谈流,从一个流中读入数据,什么是流呀
- 请教:数据库的查询 !!!
- 数据库错误:连接已超时!!!!!!
- 快速报表怎么分页
var
d1,d2:TDateTime;
result:String;
begin
d1:=StrToDateTime('2003-01-1');
d2:=StrToDateTime('2003-05-05');
Caption:=Format('%s-%s-%s',[inttostr( YearsBetween(d1,d2)),
inttostr( MonthsBetween(d1,d2)),
inttostr( daysBetween(d1,d2)mod 30)])//可能不准确,因为月不一定是30天,总的来讲,我认为你的表示是没有意义的
end;
然后要能根据这个结果进行排序
我不知道应该把建立一个字段保存结果不是利用计算字段,,如果以字符字段来保存结果的
话,就不能排序了如果用整型保存结果(daysbetween)的话用户查看就不够直观。。大家有什么好建议吗???请不吝赐教了
看看这样行不行?uses Controls,SysUtils,DateUtils;
implementation
function GapOfDay(Day1,Day2:TDate):string;
begin
result:= inttostr(YearsBetween(Day2,Day1))+'年'+
inttostr(MonthsBetween(Day2,Day1))+'月'+
inttostr(DaysBetween(Day2,Day1))+'日';
end;
上面的是不是反了
听起来象是为 殡仪馆 写东西一样那么直接用integer好了,最准确,排序也简单,显示出来可以直接转一下
字符字段也是可以排序的
inttostr( MonthsBetween(d1,d2)),
inttostr( daysBetween(d1,d2)mod 30)])
-----------
上面的是错误的
年月 不管 mod多少都有问题
--------
强烈建议用integer
Y1:=yearof(第一个日期); M1:=monthof(..).........
第一个日期的年为Y1 第二个日期的年为Y2,相减年数为Y3 Y3:=Y2-Y1;
第一个日期的月为M1 第二个日期的月为M2, 相减月数为M3
月的进制是12进制,
如果第一个日期的月比第一个日期的月大的话,正常减.
如果第二个日期的月比第一个日期的月小的话,比如 02-02-02 与05-01-01。这样的话可以把年与年的差值减去1,Y3:=Y3-1; 然后把第二个日期的月加上12。
M2:=M2+12;
再减去第一个日期的月 M3:=M2-M1;
月的计算方法就是
if m2>m1 then
m3:=m2-m1
else
begin
y3:=y3-1;
m2:=m2+12;
m3:=m2-m1;
end;
以上是月的计算方法。
然后是天数的。也是减,不过要写一个CASE,因为每个月的天数不同,天数的问题比较头疼。因为天数没法计算,如果是02-01-03和05-02-01比较好算,按31天算了,不过如果是02-01-03和05-05-01,它的天数你按5月算还是1月算,还是2月,3月,4月的天数算呢?你定义一个规则才能写代码的。如果不让我写代码,我对于这个问题都不会算呢,因为每个人的计算方法不同。如果你选择了方法,无论是天数都为30天,或是按第一个日期的当月为准或是按第二个日期的前一个月为准,那这段代码就能写出来了,具体加点CASE就行了。兄弟天数的问题你写写吧。首先想想计算方法,我关注着:)写好了,麻烦把代码贴出来,让大家共享吧。