引言:
今天在工作上接到一个任务,需要使用C#编写一个接口用于计算特定时间内的压力合格率,该功能逻辑为
1根据传入的参数,找到对应的压力站点
2根据压力站点找到对应的传感器
3根据传感器找到对应的报警历史和传感器个数
4根据报警历史(AlertstartTime和AlertendTime)得到我们所报警的时间总和
5在利用我们传入的EndTime减去StartTime,得到我们规定的时间总和并乘以传感器个数,使用报警时间总和除以该总和就可以得到我们所需要的合格率,并以保留两位小数的方式输出
以上就是该逻辑,
首先是完成了数据库的查询,查询比较简单,就是join 连接表进行查询即可
重点是如何对时间类型的值进行减法,并得到总时间(我是以分为单位)
这里是已得到了数据库的查询结果,接下来对结果进行操作
int num=0;
string temp="";
for (int i = 0; i < dt.Rows.Count; i++)
{ //得到对应的报警时间总和
allalerttime += (dt.Rows[i]["ends"].ToDateTime()- dt.Rows[i]["start"].ToDateTime()).TotalMinutes;
//得到对应的传感器个数
if(temp!=dt.Rows[i]["id"].toString()){
temp=dt.Rows[i]["id"].toString();
num++;
}
}
可以看到,我是调用了ToDateTime()将该类型转换为时间类型,接着进行减法操作,最后调用TotalMinutes方法,将该时间值转换为分钟显示出来。
这样我们便可以得到我们所有的报警时间总和了
接下来就要对我们传入的参数进行操作
double alltimes=(endTime.ToDateTime()-startTime.ToDateTime()).TotalMinutes;
这样便得到了我们的报警时间总合和我们规定的时间总合
接下来定义一个double类型的参数来接收结果
double calculate=Math.Round(((allalerttime / alltimes) + (allalerttime % alltimes)), 2, MidpointRounding.AwayFromZero)
这里说一下这个方法,有三个参数
1我们所要进行操作的数值
2我们想要保留的小数位
3指定舍入的规则
这样就完成对时间类型数据的操作!!!
最后贴一个数据SQL,有兴趣的可以看看:
select ahis.StartTime as start,ahis.EndTime as ends,sen.ID as id
from SCADA_Station sta
left join SCADA_StationType staty on sta.StationTypeID = staty.ID
left join SCADA_Sensor sen on sen.StationID = sta.ID
left join SCADA_AlertHistory ahis on ahis.SensorID = sen.ID
left join SCADA_AlertValue ave on ave.AlertID = ahis.ID
where (Feedback is null or Feedback != '报警方案变更') and IsNull(ave.是否删除,0)!= 1
and staty.Name='{stationTypeName}' and sen.Name='{sensorTypeName}' and ahis.StartTime>'{dateFrom}' and ahis.EndTime<'{dateTo}'
order by id,start