我的数据库中有以下日期时间。如果我当前的系统日期时间是“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 :(得分: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();
答案 1 :(得分:0)
select * from tbl where d=(select max(d) from tbl where d<sysdate())
SQL小提琴 - http://sqlfiddle.com/#!2/d577c/3
答案 2 :(得分: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()))
) ;
答案 3 :(得分:0)
以下方法可以帮助您(这不是最佳方法,但它应该做的工作):
首先,通过从DateTime.Now
的值中减去每个日期,从可用日期中选择最接近的日期并订购结果,然后选择第一项:
var itemWithClosestDate = dbContext.Table
.OrderBy(x => Math.Abs((DateTime.Now - x.Date).TotalMilliseconds))
.First();