4

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

例子:

一读 - 10 千瓦,下午 1.01
第二次阅读 - 1.23pm 15 千瓦
第三次阅读 - 11 千瓦,下午 1.30

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

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

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

    我想把所有的值加起来得到平均值,但我妈妈说我应该画出一整天所有读数的图表,然后得到绘制线下方的区域(有点像得到积分图),然后它会给我一天消耗的总功率。然后我应该使用这个值除以一整天的持续时间(以小时为单位)以获得千瓦时,对吗?

  2. 如何使用数据库执行此操作?如果一天有数千个读数(来自多个电气设备,在这种情况下我们有 3 列 - [time]、[kw_value]、[deviceid]),我应该如何计算这个,我应该加载所有值内存(我正在使用 C#)并从那里计算或者我可以使用 SQL 来计算这个吗?

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

4

3 回答 3

1

你肯定不会得到准确的千瓦时值。由于轮询频率如此之低,您最终可能会在估计使用量和实际使用量之间产生非常大的差异。你举这个例子:

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 kW,估计使用量为 (12.5 * 0.367) 或 4.58 kWh。

不过,这种方法存在一些明显的漏洞。如果实际消耗是:

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 kW 一分钟,或 0.16 kWh。

这些数字可能会在另一个方向上相差类似的数量。也就是说,您的计算可能非常低而不是非常高。

如果这是合理的,我会做一个 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 编写查询,以正确的顺序返回所有读数。然后,您可以使用 aSqlDataReader按顺序移动结果,计算每个时期的消耗(使用上面显示的平均计算),并对每台机器的结果求和。我不太了解 SQL 是否可以编写一个查询来为您完成所有计算并返回一个结果集,例如:

machine1, start time, end time, total power consumed
machine2, start time, end time, total power consumed
etc
于 2013-01-07T05:29:31.987 回答
0

此查询查找每一行的前一行。然后对于每个间隔,它假设整个间隔从一开始就具有 kwh 值。

; 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)
于 2013-01-06T15:00:33.453 回答
0

我的解决方案试图处理天间隔和测量间隔的重叠:

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");
        }
于 2013-01-06T15:38:24.833 回答