如何找到最近的日期

Posted

技术标签:

【中文标题】如何找到最近的日期【英文标题】:How to find the nearest date 【发布时间】:2016-09-17 13:08:01 【问题描述】:

我有三个精度的图表。

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

我的数据表如下所示:

当我生成图表时,我从特殊日期时间开始,例如从当前日期时间开始

例如。当我从 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();

但它仅适用于每小时精度。

感谢您的帮助!

【问题讨论】:

你有一个time table 可以加入和聚合吗? 您需要能够从随机时间开始还是总是 15 分钟的倍数?例如。您的开始时间可以是 18:03:45(然后您需要最接近 18:18:45 的时间,依此类推),还是您总是从整数值开始(18:00 或 18:15、18 :30, ...?) dastination-data - 我不知道它如何解决我的问题,你能给我写个例子吗? Solarflare - 我总是从整数开始。 第二个问题:你的工作报告代码只会在你整整一小时后给你时间,所以如果你有 17:59 和 18:03,它会给你 18:03 到 18: 00.你说你的报告在整个小时内都能正常工作。是这样吗,你不想包括过去的时间吗?这样会轻松很多! 【参考方案1】:

你只展示了有限的代码,即使在几个问题之后也没有完全具体说明某些点,所以我假设如下:

您可以创建每小时精度的工作报告,这意味着您可以生成所需时间的列表,例如18:00, 18:15, 18:30 间隔 15 分钟(您只是无法获得正确的数据),这些时间在变量 fromTime

您总是将轮次作为报告时间,例如18:00,从不 17:48

您最接近的条目可以在查询时间之前和之后

如果你这样做,例如一个 15 分钟的报告,并且您的数据库中没有日期时间在 17:45:00 和 18:14:59 之间的值,该报告在 18:00 将没有任何结果(因为您的数据每 3 分钟覆盖一次,所以它无论如何都应该不是问题,除了暂停)

您必须对 3 个间隔时间使用不同的查询。使用 15 分钟(假设您的表名为 a):

select *
from
(select *,
 convert(timestamp(date(date_add(CreatedDate, INTERVAL '7:30' MINUTE_SECOND)), 
         maketime(hour(date_add(CreatedDate, INTERVAL '7:30' MINUTE_SECOND)), 
         round(minute(date_add(CreatedDate, INTERVAL '7:30' MINUTE_SECOND)) div 15) 
          * 15, 0)), datetime) as filtertime
 from a
) as withfilter
order by filtertime, abs(timediff(filtertime, CreatedDate)) ;

对于其他间隔,您必须相应地替换间隔(因此将 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:0060)。

这基本上会将您的CreatedDate 舍入到最接近的整数 15/30/60 分钟,并按与其的时差排序。它总是会四舍五入,因此 CreatedDate 2016-05-20 09:15:00 将在 30 分钟内四舍五入为 2016-05-20 09:30:00,而不是 2016-05-20 09:00:00

您可能想直接查看结果以了解最终视图;对于您的示例数据,例如2016-05-20 09:18:40,它将首先计算过滤时间2016-05-20 09:15:002016-05-20 09:30:002016-05-20 09:00:00 3 个查询 15 分钟、30 分钟和 1 小时。然后它将根据他们与这些时间的距离(3:40 分钟、11:20 分钟和 18:40 分钟)对其进行排序。

您的报告过滤器必须使用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();

【讨论】:

【参考方案2】:

这个怎么样,以获得最接近特定间隔的时间:

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);

【讨论】:

以上是关于如何找到最近的日期的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中查找最近的日期

有效地找到最近的字典键

MS Access 最大日期和最近日期及其各自的数量

如何使用 date-fns 找到一周中最近的一天

MySQL:查找过去或将来的最近日期

MySQL - 如何自动化视图查询,从最近的日期减去前一天的指标和日期戳最近的数据