我认为 ojblass 指的是您从问题中省略的 DataTime 字段。
MS SQL Server 中的实际时间戳数据类型在名称上具有误导性。它与日期和时间无关。它是一个二进制“版本号”。它主要用于在更新表中的行时处理并发问题,但对于任何分析任务都无用。
我建议稍微改进一下你的列名。调用列“DateTime”会令人困惑,如果您不小心,可能会在编写查询时遇到一些麻烦。
无论如何...如果直接用 TSQL 编写,您正在寻找的查询范围从简单到相当复杂。
以下是一些示例(我没有对这些进行语法检查,因此它们充其量是“近似的”):
特定方法的平均时间
select avg(TimeInMs) as AvgTime from Table
where ApplicaitonName = @ApplicationName
过去 1 分钟内特定方法的平均时间
select avg(TimeInMs) as AvgTime from Table
where ApplicaitonName = @ApplicationName and
[DateTime] >= DATEADD(minute, -1, getdate())
您最终会想要为其中的大多数编写存储过程。你谈论的一些查询也需要一些分组等等……如果你走这条路,我建议你买一本关于 TSQL 的书。
如果您在应用程序中使用 LINQ to SQL 执行此操作,则没有太大不同,但通常 LINQ 更容易编写(当然值得商榷)。
这是在 C# 中使用 LINQ to SQL 的相同的两个查询(同样,我没有测试这些,所以我可能是轻微的语法错误)。
var ctx = new MyDataContext();
var q = (from item in ctx.Table
where item.ApplicationName == "MyApplication"
select item.TimeInMs).Average();
var ctx = new MyDataContext();
var q = (from item in ctx.Table
where item.ApplicationName == "MyApplication" &&
item.DateTime <= DateTime.Now.AddMinutes(-1)
select new item.TimeInMs).Average();
您如何进行分析取决于您使用的技术以及您对结果的处理方式。
更新:
回答评论中的后续问题:
我想不出一种好的方法来处理它,方法是将所需的时间间隔存储在另一个不会变得非常困难的表中(游标和通过 Execture 命令动态构建的 TSQL)。
获得您想要的结果的更简单的查询在 TSQL 中可能看起来像这样(我并不主张这是“最好的”方式,但它可以工作并且非常快)。
select avg(TimeInMs) as AvgTime, 'Last 1 minute' as TimePeriod from Table
where ApplicaitonName = @ApplicationName and
[DateTime] >= DATEADD(minute, -1, getdate())
union
select avg(TimeInMs) as AvgTime, 'Last 2 minutes' as TimePeriod from Table
where ApplicaitonName = @ApplicationName and
[DateTime] >= DATEADD(minute, -2, getdate())
-- //repeat union as many times as needed for each time period