2

我的数据库中有以下日期时间。如果我当前的系统日期时间是“2012-11-24 03:50:00.000”,那么应该输出为第三条记录。如何通过 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

如果您想要所有绑定的结果,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 回答
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 回答