C# 如何找到最近的日期
我有三个精度的图表 每小时, 每30分钟, 每15分钟 包含我的数据的表如下所示:C# 如何找到最近的日期,c#,mysql,sql-server,lambda,entity-framework-6,C#,Mysql,Sql Server,Lambda,Entity Framework 6,我有三个精度的图表 每小时, 每30分钟, 每15分钟 包含我的数据的表如下所示: var report = _reportRepository.FindBy(a => a.Fridge.FridgeIdentity == fridgeIdentity && a.CreatedDate.Year == fromTime.Year && a.CreatedDate.Month == fromTime.Month && a.CreatedDate
var report = _reportRepository.FindBy(a => a.Fridge.FridgeIdentity == fridgeIdentity && a.CreatedDate.Year == fromTime.Year && a.CreatedDate.Month == fromTime.Month && a.CreatedDate.Day == fromTime.Day && a.CreatedDate.Hour == fromTime.Hour).FirstOrDefault();
当我生成图表时,我从特殊日期时间开始,例如从当前日期时间开始
比如说。当我从18:00开始,我的预切是每15分钟一次,我需要这次的数据
- 18:00
- 17:45
- 17:30
- 17:15
- 17:00
var report = _reportRepository.FindBy(a => a.Fridge.FridgeIdentity == fridgeIdentity && a.CreatedDate.Year == fromTime.Year && a.CreatedDate.Month == fromTime.Month && a.CreatedDate.Day == fromTime.Day && a.CreatedDate.Hour == fromTime.Hour).FirstOrDefault();
但它的工作仅限于每小时的精度
谢谢你的帮助 这样做如何,以获得最接近特定间隔的时间:
var fromTime = new DateTime(2016, 05, 20, 9, 0, 0);
var report = _reportRepository
.OrderBy(m =>m.CreatedDate > fromTime
? m.CreatedDate - fromTime
: fromTime - m.CreatedDate)
.Take(1);
您只展示了有限的代码,即使在提出了几个问题之后,也没有完全明确地说明某些要点,因此我将假设如下:
- 您可以创建每小时精度的工作报告,这意味着您可以生成所需时间的列表,例如18:00、18:15、18:30,间隔15分钟(您无法获得正确的数据),这些时间在变量
fromTime
- 你总是有四舍五入的报到时间,例如18:00,而不是17:48
- 最接近的条目可以在查询时间之前和之后
- 如果您这样做,例如15分钟的报告,并且数据库中没有datetime介于17:45:00和18:14:59之间的值,则该报告在18:00时不会有任何结果(因为您的数据每3分钟覆盖一次,所以除了暂停之外,这应该不会是问题)
a
):
对于其他间隔,您必须相应地替换间隔(因此将7:30
替换为间隔时间(以分钟为单位)的一半,将15
替换为间隔时间(以分钟为单位),因此对于30分钟间隔,应为:
select *
from
(select *,
convert(timestamp(date(date_add(CreatedDate, INTERVAL '15:00' MINUTE_SECOND)),
maketime(hour(date_add(CreatedDate, INTERVAL '15:00' MINUTE_SECOND)),
round(minute(date_add(CreatedDate, INTERVAL '15:00' MINUTE_SECOND)) div 30)
* 30, 0)), datetime) as filtertime
from a
) as withfilter
order by filtertime, abs(timediff(filtertime, CreatedDate)) ;
(每小时间隔为30:00
和60
)
这将基本上将您的CreatedDate
四舍五入到最接近的15/30/60分钟,并按时间差排序。它将始终四舍五入,因此CreatedDate
2016-05-20 09:15:00
将四舍五入到2016-05-20 09:30:00
,间隔30分钟,而不是2016-05-20 09:00
您可能希望直接查看结果以了解最终视图;对于示例数据,例如,2016-05-20 09:18:40
,它将首先计算3个查询的过滤时间2016-05-20 09:15:00
,2016-05-20 09:30:00
和2016-05-20 09:00:00
。它将然后根据他们到这些时间(3:40分钟、11:20分钟和18:40分钟)的距离订购
您的reportfilter必须使用filtertime
而不是CreatedDate
时间,并且您必须添加分钟数以与fromtime
进行比较:
var report = _reportRepository.FindBy(a => a.Fridge.FridgeIdentity == fridgeIdentity
&& a.filtertime.Year == fromTime.Year
&& a.filtertime.Month == fromTime.Month
&& a.filtertime.Day == fromTime.Day
&& a.filtertime.Hour == fromTime.Hour
&& a.filtertime.Minute == fromTime.Minute).FirstOrDefault();
您是否有一个可以加入并聚合的时间?您是否需要能够从随机时间开始,还是始终是15分钟的倍数?例如,您的开始时间是否可以是18:03:45(然后您需要最接近18:18:45的时间,依此类推),或者您是否始终从四舍五入值开始(18:00,或18:15,18:30,…)目标数据-我不知道它是如何解决我的问题的,你能给我写个例子吗?Solarflare-我总是从四舍五入的值开始。还有第二个问题:你的工作报告代码只会给你整小时后的时间,所以如果你有17:59和18:03,它会给你18:00的18:03。你说你的报告在整小时内正确工作是这样吗,你不想包括过去的时间吗?这会让事情变得容易得多!