Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到最近的日期_C#_Mysql_Sql Server_Lambda_Entity Framework 6 - Fatal编程技术网

C# 如何找到最近的日期

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

我有三个精度的图表

每小时, 每30分钟, 每15分钟

包含我的数据的表如下所示:

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
在我的数据表中,我有每3分钟的最大数据量,所以当我想从17:15获取数据时,我的lambda查询返回null,因为我只有17:13和17:16的数据

因此,我需要返回最接近我的数据时间的数据的查询。在上面的示例中,需要返回17:16的数据

我尝试了DiffHours方法,但它在MySQL上不起作用。我需要在MySQL和MSSQL上工作的方法

我当前的方法如下所示:

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分钟覆盖一次,所以除了暂停之外,这应该不会是问题)

您必须对3个间隔时间使用不同的查询。使用15分钟(假设您的表名为
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。你说你的报告在整小时内正确工作是这样吗,你不想包括过去的时间吗?这会让事情变得容易得多!