SQL Server:获取日期最接近给定日期的记录

时间:2018-10-17 11:40:56

标签: sql sql-server date

我有一个dbo.studies表,datetime column studydate

我想使用datetime变量givendate查询数据库,以找到最接近datetimecolumn studydate的记录

使用:

SELECT TOP 1 *
FROM studies
WHERE studies.studydate < givendate
ORDER BY studies.studydate DESC

将导致记录离givendate 少且最接近,但我需要记录最接近 givendate不管是小于还是大于,然后是studydate

关于如何找到它的任何想法?

3 个答案:

答案 0 :(得分:3)

一种方法是:

SELECT TOP 1 s.*
FROM studies s
ORDER BY ABS(DATEDIFF(day, s.studydate, @givendate));

这使用DATEDIFF()来获取最接近的日期。请注意,这是使用day作为区别。如果您的“日期”具有时间成分,则可能需要其他日期部分。

请注意,这将不会利用索引。更快的方法(如果有索引)会更复杂:

SELECT TOP (1) s.*
FROM ((SELECT TOP 1 s.*
       FROM studies s
       WHERE s.studydate <= @givendate
       ORDER BY s.studydate DESC
      ) UNION ALL
      (SELECT TOP 1 s.*
       FROM studies s
       WHERE s.studydate > @givendate
       ORDER BY s.studydate ASC
      )
     ) s
ORDER BY DATEDIFF(day, s.studydate, @givendate));

尽管这更复杂,但是每个子查询都可以在studydate上使用索引。最后的排序只有两行,因此应该非常快。

答案 1 :(得分:0)

依次使用datediff函数将始终返回最接近的1

SELECT TOP 1 *
FROM studies    
ORDER BY  DATEDIFF(dd,studies.studydate, givendate) ASC

答案 2 :(得分:0)

SELECT TOP 1 *
FROM studies
ORDER BY ABS(DATEDIFF(second, @givendate, studies.studydate))