C# 基于时间间隔的linq查询
数据包含每分钟的条目,但我只需要每5分钟的数据,例如: 我目前的数据:C# 基于时间间隔的linq查询,c#,sql,asp.net-mvc,linq,C#,Sql,Asp.net Mvc,Linq,数据包含每分钟的条目,但我只需要每5分钟的数据,例如: 我目前的数据: [12:00, 12:02, 12:03, 12:04, 12:05, 12:06, 12:07, 12:08, 12:09, 12:10, 12:11, 12:12, 12:13, 12:14, 12:15, 12:16, 12:17, 12:18, 12:19, 12:20] 我的目标是: [12:00, 12:05, 12:10, 12:20,] 我的林克: public ActionResult GetD
[12:00, 12:02, 12:03, 12:04, 12:05, 12:06, 12:07, 12:08, 12:09, 12:10, 12:11, 12:12, 12:13, 12:14, 12:15, 12:16, 12:17, 12:18, 12:19, 12:20]
我的目标是:
[12:00, 12:05, 12:10, 12:20,]
我的林克:
public ActionResult GetData()
{
FireViewModel _fireViewModel = new FireViewModel();
var query = (from w1 in db.V_PDCPowerDemandArchiveForMis
where db.V_LastEafHeat.Any(w2 => w1.DATE >= w2.StartTime)
orderby w1.DATE descending
select w1).Take(20).ToList();
foreach (var item in query)
{
_fireViewModel.Power.Add(item.EAF1);
_fireViewModel.Date.Add(item.DATE.ToShortTimeString());
}
return PartialView("_Fire",_fireViewModel);
}
我假设您想要实现的是将您的记录分组,以便您可以找到属于12:00到12:05范围的记录,以及属于12:05到12:10范围的记录,等等 然后你需要用00、05、10等来替换你的时间的一分钟部分。 你可以通过做一轮来做到这一点。将第二部分强制转换为float,除以5:02变为0.4,08变为1.6,依此类推。然后使用舍入(n,0)舍入到下一个整数,0.2变为0,而0.8变为2。一旦完成,乘以5,你的数字就会从5跳到5。见下面的例子
DECLARE @Nu TABLE (valsec CHAR(2), valfloat FLOAT)
INSERT INTO @Nu (valsec) VALUES ('01')
INSERT INTO @Nu (valsec) VALUES ('02')
INSERT INTO @Nu (valsec) VALUES ('03')
INSERT INTO @Nu (valsec) VALUES ('04')
INSERT INTO @Nu (valsec) VALUES ('05')
INSERT INTO @Nu (valsec) VALUES ('06')
INSERT INTO @Nu (valsec) VALUES ('07')
INSERT INTO @Nu (valsec) VALUES ('08')
INSERT INTO @Nu (valsec) VALUES ('09')
INSERT INTO @Nu (valsec) VALUES ('10')
INSERT INTO @Nu (valsec) VALUES ('11')
INSERT INTO @Nu (valsec) VALUES ('12')
INSERT INTO @Nu (valsec) VALUES ('13')
INSERT INTO @Nu (valsec) VALUES ('14')
INSERT INTO @Nu (valsec) VALUES ('15')
INSERT INTO @Nu (valsec) VALUES ('16')
INSERT INTO @Nu (valsec) VALUES ('17')
INSERT INTO @Nu (valsec) VALUES ('18')
INSERT INTO @Nu (valsec) VALUES ('19')
INSERT INTO @Nu (valsec) VALUES ('20')
UPDATE @Nu SET valfloat = CAST (valsec AS FLOAT) / 5
SELECT
valsec,
valfloat,
ROUND (valfloat,0)*5 AS secint,
RIGHT (CAST (( ROUND (valfloat,0)*5 + 100) AS VARCHAR(3) ),2) AS secchar
FROM @Nu
结果:
01 0.2 0 00
02 0.4 0 00
03 0.6 5 05
04 0.8 5 05
05 1 5 05
06 1.2 5 05
07 1.4 5 05
08 1.6 10 10
09 1.8 10 10
10 2 10 10
11 2.2 10 10
12 2.4 10 10
13 2.6 15 15
14 2.8 15 15
15 3 15 15
16 3.2 15 15
17 3.4 15 15
18 3.6 20 20
19 3.8 20 20
20 4 20 20
注:本节
RIGHT (CAST (( ROUND (valfloat,0)*5 + 100) AS VARCHAR(3) ),2)
仅通过添加100并获取最后两个字符将数字转换为字符(2)(这样您得到的是05而不是5)键是w1。分钟%5==0我应该在foreach中设置如下条件:
public ActionResult GetFuranceOne()
{
FireViewModel _fireViewModel = new FireViewModel();
var query = (from w1 in db.V_PDCPowerDemandArchiveForMis
where db.V_LastEafHeat.Any(w2 => w1.DATE >= w2.StartTime)
orderby w1.DATE descending
select w1).Take(50);
foreach (var item in query.ToList())
{
if (item.DATE.Minute % 5==0)
{
_fireViewModel.Power.Add(item.EAF1);
_fireViewModel.Date.Add(item.DATE.ToShortTimeString());
}
}
return PartialView("_Fire", _fireViewModel);
}
只是日期,还是有一些相关数据需要平均或求和?您需要更好地显示相关代码和相关数据类型。也就是说,解决方案的想法很简单:编写一个函数,将时间序列数据映射到适当的存储桶中。一旦你有了这个映射,你可以在你的
GroupBy
callyes中简单地使用这个函数,有一个属性,它叫做Power属性。功率值取决于日期值这并不完全清楚,但看起来需要根据“分钟数是5的倍数”谓词进行筛选,例如:“where w1.Minute%5==0”。是的,关键是我应该执行w1.Minute%5==0