从数据库中的一系列Kw读数(当时的Kw值)确定每日Kwh值的正确方法是什么?
本文关键字:Kw Kwh 每日 方法 是什么 数据库 读数 当时的 一系列 | 更新日期: 2023-09-27 17:50:47
我有一个装置,它读取电力设备的kw值,以测量它们在特定时间的(能量消耗率)。然后将这些值发送给轮询器(它定期向设备询问这些值),并插入到数据库中。
的例子:<>之前第一次读数- 10千瓦在下午1点01分第二次读数-下午1点23分15千瓦第三次读数:下午1时30分11kw之前
可以看到,轮询间隔不是固定的,因此可以在不同的时间将值插入数据库。为了简单起见,我们可以把数据库想象成一个有两列[time]和[kw_value]的表。
这实际上是一个两部分的问题:
-
如何从这些读数(全天能耗)中得到每日千瓦时值?我的数学很差,所以我不知道从这些值中得到每日千瓦时值的正确方法。
我想把所有的值加起来,然后得到平均值,但是我妈妈说我应该画一个全天所有读数的图表,然后得到绘制线下面的面积(有点像得到图表的积分),这样我就能得到一天的总耗电量。然后我应该用这个值除以全天的持续时间,以小时为单位,得到千瓦时,对吗?
-
我如何使用数据库做到这一点?如果有成千上万的读数在一天(从多个电子设备,在这种情况下,我们有3列-[时间],[kw_value],[deviceid]),我应该如何计算这个,我应该加载所有的值在内存中(我使用c#),并从那里计算,或者我可以使用SQL来计算这个?
编辑:谢谢大家指出kw和kwh之间的区别。我在最初的问题上犯了一个大错误,因此进行了编辑。重申一下,该设备在特定时间读取kw值(以千焦耳/秒为单位的能耗率),并在数据库中给出这些值的列表/图,确定给定日期的KWH(总能耗)的正确方法是什么?
你当然不会得到一个确切的千瓦时值。使用这种不频繁的轮询频率,最终可能会在估计和实际使用之间产生非常大的差异。你给这个例子:
1st reading - 10 kW at 1.01pm
2nd reading - 15 kW at 1.23pm
3rd reading - 11 kW at 1.30pm
在没有其他信息的情况下,唯一合理的做法是对每对读数取平均值,然后乘以时间。从1.01到1.23是22分钟,或0.367小时。在此期间的平均读数为(10 + 15)/2,或12.5千瓦,估计使用量为(12.5 * 0.367),或4.58千瓦时。
但是,这种方法存在一些明显的漏洞。如果实际消费是:10 kW at 1.01pm
0 kW at 1.02pm // machine turned off
15 kW at 1.23pm // machine turned back on
11 kW at 1.29pm
在1.01至1.23期间,您的实际用电量为每分钟10千瓦,或0.16千瓦时。
这些数字在另一个方向上也可能有类似的误差。也就是说,你的计算可能非常低,而不是非常高。
如果这是合理的,我要做的是做一个SQL查询,返回按机器和时间排序的数据。所以你得到:
machine1, 1.01 am, reading
machine1, 1.20 am, reading
... etc. ...
machine2, 1.03, reading
machine2, 2.15, reading
所以机器1的所有读数都按时间顺序呈现给你,然后是机器2,等等。
你当然可以写一个使用ORDER BY和GROUP BY的查询,以正确的顺序返回所有的读数。然后,您可以使用SqlDataReader
依次遍历结果,计算每个时间段的消耗(使用上面所示的平均计算),并将每台机器的结果相加。我不太了解SQL,所以不能说是否有可能编写一个查询,为您完成所有计算并返回一个结果集,例如:
machine1, start time, end time, total power consumed
machine2, start time, end time, total power consumed
etc
该查询查找每一行的前一行。然后,对于每个间隔,它假设整个间隔从一开始就具有千瓦时值。
; with numbered as
(
select *
, row_number() over (partition by deviceid order by time) rn
from YourTable
)
select deviceid
, sum(t0.kwh_value * datediff(s, t0.[time], t1.[time])/3600)
from numbered t1
join numbered t0
on t1.deviceid = t0.deviceid
and t1.rn = t0.rn + 1
group by
deviceid
您可以修改查询来计算间隔时间内的平均千瓦时使用量:
, sum((t1.kwh_value + t0.kwh_value)/2 * datediff(s, t0.[time], t1.[time])/3600)
我的解决方案试图处理每天间隔和测量间隔的重叠:
public class Measurement
{
public DateTime t;
public double kwh;
public Measurement(string t, double kwh)
{
this.t = DateTime.Parse(t);
this.kwh = kwh;
}
}
public static double getPowerConsumption(IEnumerable<Measurement> measurements, DateTime day)
{
DateTime never = DateTime.MinValue;
DateTime tomorrow = day.AddDays(1);
DateTime prev = never;
double kwh = 0;
foreach (Measurement m in measurements)
{
if (m.t >= day)
// measurement in our after or day
{
if (m.t >= tomorrow)
{
if ((prev != never) && (prev < m.t))
{
// add portion up to midnight
kwh += m.kwh * (tomorrow.Ticks - prev.Ticks) / (double)(m.t.Ticks - prev.Ticks);
}
break;
}
else if ((prev != never) && (prev < day) && (prev < m.t))
{
kwh += m.kwh * (m.t.Ticks - day.Ticks) / (double)(m.t.Ticks - prev.Ticks);
}
else
{
kwh += m.kwh;
}
}
prev = m.t;
}
return kwh;
}
static void Main(string[] args)
{
DateTime myDay = new DateTime(2012, 11, 2);
List<Measurement> measurements = new List<Measurement>() { new Measurement("01.11.2012 23:30", 10),
new Measurement("02.11.2012 10:00", 1),
new Measurement("02.11.2012 23:30", 5),
new Measurement("03.11.2012 10:00", 6) };
double kwh = getPowerConsumption(measurements, myDay);
Console.WriteLine("Powerconsumption for " + myDay.ToShortDateString() + " was " + kwh.ToString("#.##") + "kWh");
}