从数据库中的一系列Kw读数(当时的Kw值)确定每日Kwh值的正确方法是什么?

本文关键字:Kw Kwh 每日 方法 是什么 数据库 读数 当时的 一系列 | 更新日期: 2023-09-27 17:50:47

我有一个装置,它读取电力设备的kw值,以测量它们在特定时间的(能量消耗率)。然后将这些值发送给轮询器(它定期向设备询问这些值),并插入到数据库中。

的例子:<>之前第一次读数- 10千瓦在下午1点01分第二次读数-下午1点23分15千瓦第三次读数:下午1时30分11kw之前

可以看到,轮询间隔不是固定的,因此可以在不同的时间将值插入数据库。为了简单起见,我们可以把数据库想象成一个有两列[time]和[kw_value]的表。

这实际上是一个两部分的问题:

  1. 如何从这些读数(全天能耗)中得到每日千瓦时值?我的数学很差,所以我不知道从这些值中得到每日千瓦时值的正确方法。

    我想把所有的值加起来,然后得到平均值,但是我妈妈说我应该画一个全天所有读数的图表,然后得到绘制线下面的面积(有点像得到图表的积分),这样我就能得到一天的总耗电量。然后我应该用这个值除以全天的持续时间,以小时为单位,得到千瓦时,对吗?

  2. 我如何使用数据库做到这一点?如果有成千上万的读数在一天(从多个电子设备,在这种情况下,我们有3列-[时间],[kw_value],[deviceid]),我应该如何计算这个,我应该加载所有的值在内存中(我使用c#),并从那里计算,或者我可以使用SQL来计算这个?

编辑:谢谢大家指出kw和kwh之间的区别。我在最初的问题上犯了一个大错误,因此进行了编辑。重申一下,该设备在特定时间读取kw值(以千焦耳/秒为单位的能耗率),并在数据库中给出这些值的列表/图,确定给定日期的KWH(总能耗)的正确方法是什么?

从数据库中的一系列Kw读数(当时的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");
        }