簡體   English   中英

如何找到最近的日期

[英]How to find the nearest date

我有三個精度的圖表。

每小時,每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();

但它只適用於每小時精度。

感謝幫助!

怎么樣,以獲得最接近特定間隔的時間:

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:0060 )。

這將基本上將您的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:002016-05-20 09:30:002016-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM