获取日期范围内扣除的结果
本文关键字:结果 取日期 范围内 获取 | 更新日期: 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 )
根据我的理解,问题可以重述为
- 计算除 外的用法差异之和
- 在重置日期,使用金额而不是差额
例如,我们可以使用小用法类
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);
}