[英]How to find the nearest date
我有三個精度的圖表。
每小時,每30分鍾,每15分鍾一次。
我的數據表如下所示:
當我生成我的圖表時,我從特殊日期時間開始,例如從當前日期時間開始
例如。 當我從18:00開始,我的精確度是每15分鍾,我需要這個時間的數據
在我的數據表中,我每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分鍾的報告,並且數據庫中的日期時間在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
分鍾,因此間隔時間間隔為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: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
2016-05-20 09:30:00
2016-05-20 09:00:00
為3個查詢15分鍾,30分鍾和1個小時。 然后根據它們到這些時間的距離(3:40分鍾,11:20分鍾和18:40分鍾)進行排序。
您的reportfilter必須使用filtertime
而不是CreatedDate
時間,並且您必須添加要與fromtime
比較的分鍾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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.