如何找到最近的日期
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:00
和60
)。
这基本上会将您的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:00
、2016-05-20 09:30:00
和2016-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);
【讨论】:
以上是关于如何找到最近的日期的主要内容,如果未能解决你的问题,请参考以下文章