2

データベースに次の日時があります。現在のシステムの日時が「2012-11-2403:50:00.000」の場合、3番目のレコードとして出力されるはずです。どうすればlinqクエリで取得できますか?

1   2012-11-24 01:00:00.000 35466   True    False
2   2012-11-24 01:00:00.000 35466   True    False
3   2012-11-24 01:15:00.000 35466   True    False
4   2012-11-23 01:10:00.000 65456   True    False
4

4 に答える 4

2

サーバー側でクエリを実行する必要がない場合は、次の擬似コードメソッドが機能します。

  foreach value in the data set
        let distance = absolute value of ( data point - target data value )

  sort by distance, ascending

  choose first

C#では、メソッドを使用して時間間隔を簡単に計算し、たとえば、返されたオブジェクトのプロパティDateTime.Substractの絶対値を取得できます。TimeSpanDays

私はSQLの日付操作についてあまり専門的ではありませんが、次のようなものを使用して、サーバー側で同じようなことを実行できると思います。

  select * from table, abs(Datediff(datecolumn.table, sysdatetime)) as distance
  order by distance 

次に、最初の値を使用します。

申し訳ありませんが、サーバー側とクライアント側の作業を組み合わせることができるLINQ形式が必要であることに気づきました。これは次のようなものです。

(from q in datacontext.Table
let distance = Math.Abs(q.Date.Subtract(DateTime.Today).Ticks)
orderby distance
select q).First();
于 2012-11-24T10:37:01.413 に答える
0
select * from tbl where d=(select max(d) from tbl where d<sysdate()) 

SQLフィドル-http : //sqlfiddle.com/#!2 / d577c / 3

于 2012-11-24T10:27:30.030 に答える
0

すべてのタイの結果が必要な場合、SQLクエリは次のようになります。これをLinQに変換する方法がわかりません。

SELECT *
FROM tableX
WHERE DateTimeColumn IN
      ( SELECT TOP 1 d
            WITH TIES 
        FROM
          ( SELECT MIN(DateTimeColumn) AS d
            FROM tableX
            WHERE DateTimeColumn >= GETDATE()
          UNION ALL
            SELECT MAX(DateTimeColumn) 
            FROM tableX
            WHERE DateTimeColumn <= GETDATE()
          ) AS tmp
        ORDER BY ABS(DATEDIFF(millisecond, d, GETDATE()))
      ) ;
于 2012-11-24T10:45:56.250 に答える
0

次のアプローチが役立ちます(これは最適なアプローチではありませんが、機能するはずです)。

まず、の値から各日付を差し引いて利用可能な日付から最も近い日付を選択しDateTime.Now、結果を並べ替えてから、最初の項目を選択します。

var itemWithClosestDate = dbContext.Table
    .OrderBy(x => Math.Abs((DateTime.Now - x.Date).TotalMilliseconds))
    .First();
于 2012-11-24T10:47:10.270 に答える