有关电力统计问题(比较难,最少我问了几个人,待急答)(100分)

  • 主题发起人 主题发起人 wancc
  • 开始时间 开始时间
W

wancc

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个问题想请教各位:一个有关停电统计问题
 比如:停电日期为2000-02-01 9:00:00
    送电日期为2000-03-01 2:00:00
   要统计停电至送电之部的停电时间,单位为分钟
 又比如:停电和送电日期为同一日,但不同时,
   例:停电时2000-06-01,12:01:23
     送电时2000-06-01,23:23:01
   要统计停电至送电之间停电时间

   请各们高手高手高高手们,能否给我一个详细的答案!
   请同时给我回E-MAIL:wancc@163.net
 
 
Delphi的日期时间类型是浮点型,把两个数据的差乘24乘60,再取整,就O.K.了。
 
如果把两个日期时间类型的差乘24乘60乘60,结果刚好是“整数”。

TDateTime is a used by the date and time routines to hold date and time values.

Unit

System

type TDateTime = type Double;

Description

Most VCL objects represent date and time values using the TDateTime type. The
integral part of a TDateTime value is the number of days that have passed since
12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour
day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates
and times:

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
To find the fractional number of days between two dates, simply subtract the
two values. Likewise, to increment a date and time value by a certain fractional
number of days, simply add the fractional number to the date and time value.

Note: Delphi 1.0 calculated the date from year 1 instead of from 1899. To
convert a Delphi 1.0 date to a Delphi 2.0 date, subtract 693594.0 from
the Delphi 1.0 date. The date format changed to be more compatible with
OLE 2.0 Automation.
 
让我试试
 
procedure TForm1.Button1Click(Sender: TObject);
Var date1,date2:TDateTime;
f:real;
begin
date1 := StrToDateTime('95-5-11 10:30:00');
date2 := StrToDateTime('95-5-12 12:30:00');
f := (date2-date1)*24*60;
label1.caption := floattostr(f);
end;

还可以使用两个函数:
decodeDate
decodeTime
自己来判断。
 
jinal and honestman:
上面所写内容我知道了,但是还缺少了一个重要问题--闰年/闰月
例:2000-2-28, 18:00:00 停电
2000-3-1, 7:30:00 送电
统计停电时间
如例:2001-2-28 18:00:00 停电
2001-3-1 7:30:00 送电
统计停电时间
不知上述各位所说是否能支持闰年闰月问题?
请给出详细说明,谁能解决就给分.

 
如果不可以,我以后不再用Delphi了。
你自己测试一下就知道啦!
原理上没有任何区别。
只要2000-2-29, 18:00:00 对应某个数,而2001-2-29 18:00:00 没有数与之对应,就
O.K.了。

 
操作系统会自己处理闰年和闰月的问题,如果出错的话,又是一个千年虫了!
按上面的办法应该不会出问题的。
 
我自己测试一下!
 
应该是没有问题的,呵呵。
procedure TForm1.Button1Click(Sender: TObject);
Var date1,date2:TDateTime;
f:real;
begin
date1 := strtodatetime('2001-2-28 18:00:00');
date2 := strtodatetime('2001-3-1 7:30:00');
label1.caption := floattostr((date2-date1)* 24*60);//810没错
end;
 
honestman/ jianl/ 黄豆 hi
上述问题需统计当日或当月或当年的停电时间,好象不一定成功
例:2000-1-1 8:00 停电
2000-1-2 6:00 送电
2000-1-3 4:00 停电
在数据库中只有1号至2号有一个停电记录,2号而无停电记录,
统计2000-1-1的停电时间 和 2000-1-2的停电时间
或者2000-1-2中又断续的停电N次并沿至第2天,分别统计每天的停电时间
或分别统计每月和每年的停电时间

 
》在数据库中只有1号至2号有一个停电记录,2号而无停电记录,
2号没有,就设置为0:00如何?

还是看看你的表结构如何?
 
TdateTime类型实际上是Double型。任何一个日期也就是一个浮点数,其数值表示
距1899-12-31 12:0:0 的天数。因此计算两个日期间的时间差只须将两个浮点数
相减即可。
 
呵呵,Tdatetime整数部分是天数,小数部分是一天内的时间。
 
在数据库中只有1号至2号有一个停电记录,2号而无停电记录,
2号没有,就设置为0:00
能否给我一个详细点的说明

而我的数据库很大,如果在无停电的天数里,设置为0:00,那么就加大了
整个数据库的容量,整个程序执行也很慢,有没有简练的方式
 
我说的是在程序中设置。就是说,如果某天只有送电没有停电记录,计算时
就把停电时间设置为当天0:00。
 
计算间隔分钟数就照上面的方法。假设你的把停送电时间都存在一个表中,时间
作一个字段,停送电标志是布耳字段,送电为True,那上面的例子表示如下:
2000-1-1 8:00 F
2000-1-2 6:00 T
2000-1-3 4:00 F
查询2号的停电时间可以先用条件 '2000-1-2 0:00'<= 时间字段 < '2000-1-3 0:00'
把记录选出来,再遍历一次,根据 停送电标志累加所有 F 至 T 之间间隔的分钟数,
若最后一个 F 后没有 T,则把 这天的截止时间 当作 T 的记录。
 
bbkxjy我的程序要查询数据库时就有一点慢了(PII400/64M),你的方法是否会更慢
 
写出你的库结构!
 
如果在oracle里面,可以用 to_char(date,'yyyymmddhhmiss')将时间转化为14位的字符。
之后,通过TO_DATE等由ORACLE帮你解决,呵呵,省事了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部