Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
SQL server:获取日期最接近给定日期的记录_Sql_Sql Server_Date - Fatal编程技术网

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

SQL server:获取日期最接近给定日期的记录,sql,sql-server,date,Sql,Sql Server,Date,我有一个表dbo.studies和datetime列studydate 我想使用datetime变量givendate查询数据库,以在studydate列中找到最接近datetime的记录 使用: SELECT TOP 1 * FROM studies WHERE studies.studydate < givendate ORDER BY studies.studydate DESC 将导致记录越来越接近givendate,但我需要最接近givendate的记录,无论它是小于还是大于s

我有一个表dbo.studies和datetime列studydate

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

使用:

SELECT TOP 1 *
FROM studies
WHERE studies.studydate < givendate
ORDER BY studies.studydate DESC
将导致记录越来越接近givendate,但我需要最接近givendate的记录,无论它是小于还是大于studydate

关于如何找到它有什么想法吗?

一种方法是:

SELECT TOP 1 s.*
FROM studies s
ORDER BY ABS(DATEDIFF(day, s.studydate, @givendate));
这将使用DATEDIFF获取最近的日期。请注意,这是使用日来表示差异。如果日期包含时间部分,则可能需要不同的日期部分

请注意,这不会利用索引。如果您有索引,则更快的方法更为复杂:

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上使用索引。最后的排序只有两行,因此应该非常快。

使用datediff函数按顺序排序,它将始终返回最接近的1

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

在查询plsworks后添加数据输入和输出示例!我将使用比givendate更多的变量,所以您的第一个选项将很好地工作。谢谢!欢迎来到StackOverflow!最好添加几句话来解释代码是如何解决问题的
SELECT TOP 1 *
FROM studies
ORDER BY ABS(DATEDIFF(second, @givendate, studies.studydate))