SQL server:获取日期最接近给定日期的记录
我有一个表dbo.studies和datetime列studydate 我想使用datetime变量givendate查询数据库,以在studydate列中找到最接近datetime的记录 使用: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
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))