2012-11-24 92 views
2

我在我的數據庫中有以下日期時間。如果我現在的系統日期時間是「2012-11-24 03: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 
+0

最近的總是在您當前的日期之前?如果當前日期是2012-11-24 01:10:00,輸出應該如何? – rene

+1

如果有關係呢? –

+0

它是有用的:http://stackoverflow.com/questions/1705799/linq-sql-where-closest-to-number –

回答

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方法輕鬆計算時間間隔,例如,獲取返回的TimeSpan對象的Days屬性的絕對值。

我不太專家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(); 
0
select * from tbl where d=(select max(d) from tbl where d<sysdate()) 

SQL fiddle- http://sqlfiddle.com/#!2/d577c/3

+1

,如果在表中有未來的日期? – Ric

+1

這是最大值,不一定是最接近的。 – 2012-11-24 10:31:24

+0

它不顯示所有列(如OP所需),只顯示日期。 –

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())) 
    ) ; 
0

下面的辦法可以幫助你(這不是最佳方法,但它應該做的工作):

首先,從可用的選擇最接近的日期日期通過減去DateTime.Now的值中的每個日期並命令結果,然後選擇第一項:

var itemWithClosestDate = dbContext.Table 
    .OrderBy(x => Math.Abs((DateTime.Now - x.Date).TotalMilliseconds)) 
    .First(); 
+0

您需要此方法的絕對值。 – SAJ14SAJ

+0

@ SAJ14SAJ,「絕對值」是什麼意思? – RePierre

+0

Abs(2)= 2,Abs(-2)= 2 – SAJ14SAJ

相關問題