Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从数据库中获取最接近的日期时间?_C#_Sql Server_Linq_Entity Framework - Fatal编程技术网

C# 如何从数据库中获取最接近的日期时间?

C# 如何从数据库中获取最接近的日期时间?,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,Entity Framework,我的数据库中有以下日期和时间。如果我当前的系统日期时间是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:

我的数据库中有以下日期和时间。如果我当前的系统日期时间是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

SQL FIDLE-

如果您不一定要在服务器端执行查询,那么以下伪代码方法将起作用:

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

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

以下方法应该可以帮助您,虽然这不是最佳方法,但它应该可以起到作用:

首先,通过从DateTime值中减去每个日期,从可用日期中选择最近的日期。现在,对结果排序,然后选择第一项:

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

最近的日期总是在您当前的日期之前?如果当前日期是2012-11-24 01:10:00,那么输出应该是什么?如果有联系呢?这是有用的:如果表中有未来的日期?并且它不会按照OP的要求显示所有列,只显示日期。使用此方法需要绝对值。@SAJ14SAJ,绝对值是什么意思?@SAJ14SAJ,谢谢你指出错误。我已经修好了。
var itemWithClosestDate = dbContext.Table
    .OrderBy(x => Math.Abs((DateTime.Now - x.Date).TotalMilliseconds))
    .First();