[C#] 最も近い日付の検索方法


Answers

限られたコードしか示していないし、いくつかの点については全く特定されていないので、次のことを仮定します。

  • 時間単位の精度のレポートを作成することができます。つまり、希望の時間のリストを生成することができます。たとえば、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)) ;

(1時間ごとに30:0030:00 )。

これは、基本的にCreatedDateを最も近い15/30/60分に丸め、その時間差で注文します。 常に丸められますので、 CreatedDate 2016-05-20 09:15:002016-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:18:40 :15: 2016-05-20 09:30:002016-05-20 09:00:00計算します15分、30分、および1時間の3つのクエリの2016-05-20 09:00:00 。 それから、これらの時間(3:40分、11分20分、18分40分)までの距離に応じて注文します。

あなたのreportfilterはCreatedDate時間の代わりにfiltertimeを使用する必要があり、あなたは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();
Question

私は3つの精度を持つチャートを持っています。

1時間あたり、30分ごと、15分ごと。

私のデータを含むテーブルは次のようになります:

私が私のチャートを生成するとき、私は現在の日付時刻からの特別な日付時刻

例えば。 私が18:00から始まり、私の準備が15分になると、この時からのデータが必要です

  • 18:00
  • 17:45
  • 17:30
  • 17:15
  • 17:00
  • ...

私のデータテーブルでは、私は17:13と17:16のデータしか持っていないので、私は17:15から私のラムダクエリがnullを返すように私は3分ごとにデータを取得したいので、

だから私はクエリのwhitch私のデータの時刻に近いデータを返す必要があります。 上の例では、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();

それは1時間当たりの精度のためだけの仕事です。

手伝ってくれてありがとう!




Links