我正在使用以下存储过程从 SQL Server 检索数据:
SELECT *
FROM (
SELECT CAST(DateTimeUTC as SmallDateTime) as [DateTime], DataValue, VariableID
FROM DataValues
WHERE SiteID = @siteID and VariableID = 1
) TableDate
PIVOT (SUM(DataValue) FOR VariableID IN ([1])) PivotTable ORDER BY [DateTime]
然后我用这些值填充 DataSet DataTable:
DataSet myDataSet = new DataSet();
mySqlDataAdapter.Fill(myDataSet);
DataTable precip = myDataSet.Tables["Table"];
if (precip.Rows.Count > 0)
{
msPrec = precip.Rows[0].Field<DateTime>("DateTime");
sPrec = string.Join<object>(", ",
from r in precip.Rows.OfType<DataRow>() select r[1]);
}
else
{
msPrec = DateTime.MinValue;
sPrec = "";
}
在上面的示例中,msPrec 只是数据集开头的单个值。
问题是我没有考虑每小时的数据可能不连续。
这意味着可能缺少未在数据库中存储为 NULL 的数据。因此,完全有可能一条 DB 记录来自 2013-04-26 04:00:00,而 DB 中的下一条记录来自 2013-04-26 08:00:00 和 05:00、06:00 和07:00 不见了。
也有可能丢失多天的数据,而不仅仅是同一天的几个小时。
我正在用 HighCharts 的 HighStock 绘制这些数据,就像在这个例子中所示:http ://www.highcharts.com/stock/demo/data-grouping除了他们在例子中预处理数据以包含 NULL 值缺失数据,从图中的数据间隙可以看出。
解决这个问题的伪代码对我来说很清楚:
- 遍历存储过程的输出
- 将当前记录 DateTime 与下一个记录 DateTime 进行比较
- 如果 nextRecordDateTime = currentRecordDateTime + 1 小时,则继续下一条记录
- 如果 nextRecordDateTime != currentRecordDateTime + 1 小时,然后
计算 currentRecordDateTime 和 nextRecordDateTime 之间的差异,以小时
为单位将每个缺失小时的 DateTime 和 DataValue (NULL) 插入 DataTable
- 在最后插入的记录处继续循环
我查看了 MSDN 上的DataTable 类,但没有看到任何相关的内容。DataRow 类可以让我遍历行,但我不清楚如何在当前行中获取下一行的值。
所以我有两个问题;
如何在 DataSet DataTable 的当前记录(行)上考虑下一条记录(行)的 DateTime 值?
如何在正确的位置将行插入到 DataSet DataTable 中,而不是将其添加到 DataTable 的末尾?或者这里的解决方案是将其添加到末尾并对表格进行排序?