获取日期范围内扣除的结果

本文关键字:结果 取日期 范围内 获取 | 更新日期: 2023-09-27 17:53:29

我正在记录每天的数据使用情况,并希望显示出一个日期范围内的总数据使用情况。

数据在每月10号重置,所以数据使用示例如下:

Number: 001xxxxxxxx 
Date - Data
8th - 100mb
9th - 120mb
10th - 10mb
11th - 40mb

所以要得到8号到11号之间的总数据使用量,不可能用11号的数据减去8号(40mb-100mb),因为它在10号重置。

我需要这样的值,40mb+(120mb-100mb) = 60mb总使用量

这是我的方法,给数据,日期和数字到Dictionarys

private void getNumberDatas(List<int> phoneNo, DateTime dateStart, DateTime dateEnd)
{
    Dictionary<int, Dictionary<DateTime, float>> d_PhoneNo_DateDataList = new Dictionary<int, Dictionary<DateTime, float>>();
    Dictionary<DateTime, float> d_DateTime_Data = new Dictionary<DateTime, float>();
    string strConnectionString = ConfigurationManager.ConnectionStrings["xxx"].ConnectionString;
    SqlConnection conn = new SqlConnection(strConnectionString);
    string sqlcommand = "SELECT xxx FROM xxx WHERE PhoneNo=@PhoneNo AND date BETWEEN @Date1 AND @Date2";
    for (int i = 0; i < phoneNo.Count; i++)
    {
        d_DateTime_Data.Clear();
        using (SqlCommand cmd = new SqlCommand(sqlcommand, conn))
        {
            conn.Open();
            cmd.Parameters.AddWithValue("@PhoneNo", phoneNo[i]);
            cmd.Parameters.AddWithValue("@Date1", dateStart);
            cmd.Parameters.AddWithValue("@Date2", dateEnd);
            cmd.ExecuteNonQuery();
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                d_DateTime_Data.Add(DateTime.Parse(reader["Date"].ToString()), float.Parse(reader["Data"].ToString()));
            }
            conn.Close();
        }
        d_PhoneNo_DateDataList.Add(phoneNo[i], d_DateTime_Data);
    }
}

所以要获得今天的数据将是:

Dictionary<DateTime, float> temp_Datetime_data = new Dictionary<DateTime, float>();
if (d_PhoneNo_DateDataList.TryGetValue("001xxxxxxxx", out temp_Datetime_data))
{
    float dataToday;
    if (temp_Datetime_data.TryGetValue(DateTime.Today, out dataToday))
    {
        Console.WriteLine(dataToday.ToString());
    }
}

现在我的问题是,我不知道如何实现计算,如果让我们说用户选择2016年5月20日至2016年6月30日

让我知道如果它太混乱,我不知道最好的方式来解释这个

获取日期范围内扣除的结果

这不是完美的,但它将是一个很好的基础,为您的需求:

private static int getData(Dictionary<DateTime, int> values, DateTime start, DateTime stop)
{
    // Reduce the scope
    var val = values.Where(x => x.Key >= start && x.Key <= stop);
    // Create a list of ranges
    List<Dictionary<DateTime, int>> listOfMonth = new List<Dictionary<DateTime, int>>
    {
        new Dictionary<DateTime, int>()
    };
    var currentMonth = listOfMonth.Last();
    int previousValue = int.MinValue;
    foreach (KeyValuePair<DateTime, int> keyValuePair in val)
    {
        // Reset the month
        if (keyValuePair.Value < previousValue)
        {
            currentMonth = new Dictionary<DateTime, int>()
            {
                {DateTime.Now, 0} // Add placeholder
            };
            listOfMonth.Add(currentMonth);
        }
        previousValue = keyValuePair.Value;
        currentMonth.Add(keyValuePair.Key, keyValuePair.Value);
    }
    return listOfMonth.Sum(dictionary => dictionary.Values.Max() - dictionary.Values.Min());
}

使用这些数据:

Dictionary<DateTime, int> dataDictionary = new Dictionary<DateTime, int>()
{
    {new DateTime(2016, 8, 4), 20},
    {new DateTime(2016, 8, 5), 50}, 
    {new DateTime(2016, 8, 6), 70}, 
    {new DateTime(2016, 8, 7), 90},
    {new DateTime(2016, 8, 8), 100},
    {new DateTime(2016, 8, 9), 120}, 
    {new DateTime(2016, 8, 10), 10}, 
    {new DateTime(2016, 8, 11), 40}, 
};
DateTime start = new DateTime(2016, 8, 7);
DateTime stop = new DateTime(2016, 8, 11);

我得到70 ( 120 - 90 ) + ( 40 - 0 )

根据我的理解,问题可以重述为

  1. 计算除
  2. 外的用法差异之和
  3. 在重置日期,使用金额而不是差额

例如,我们可以使用小用法类

class Usage
{
    public Usage(int day, int totalUsage)
    {
        Day = day;
        TotalUsage = totalUsage;
    }
    public int Day { get; }
    public int TotalUsage { get; }
}

和表示日志

的用法列表
private readonly static List<Usage> Log = new List<Usage>
{
    new Usage(8,100),
    new Usage(9,120),
    new Usage(10,10),
    new Usage(11,40),
};

我们可以计算出这段时间的总使用量,如下所示

private void CalcTotalUsage(int startDate, int endDate, int expectedTotal)
{
    // I just used ints for the days for demo purposes, dates will not change the calculation below  
    var records = Log.Where(u => u.Day >= startDate && u.Day <= endDate);
    var total = records.Skip(1).Zip(records, (curr, prev) => (curr.TotalUsage > prev.TotalUsage) ? curr.TotalUsage - prev.TotalUsage : curr.TotalUsage).Sum();
    Assert.AreEqual(expectedTotal, total);
}

和检查它是否正常工作的测试

[TestMethod]
public void CheckTotals()
{
    CalcTotalUsage(8, 9, 20);
    CalcTotalUsage(8, 10, 30);
    CalcTotalUsage(8, 11, 60);
}