你只展示了有限的代码,并且在多次提问后仍然没有完全明确一些问题,因此我将做出以下假设:
你能够创建一个精准到小时的工作报告,这意味着你能够生成所需时间的列表,例如每15分钟的时间,例如18:00、18:15、18:30(你只是无法获得正确的数据),并且这些时间在变量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
将被舍入到
2016-05-20 09:30:00
,而不是
2016-05-20 09:00:00
,对于 30 分钟的时间间隔。
你可能需要直接查看结果来理解最终视图;例如,对于你的示例数据
2016-05-20 09:18:40
,它将首先计算三个查询15分钟、30分钟和1小时的
2016-05-20 09:15:00
、
2016-05-20 09:30:00
和
2016-05-20 09:00:00
的
filtertimes
。然后,它将按照它们到这些时间的距离进行排序(3:40min、11:20min和18:40min)。
你的报告过滤器将需要使用
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();