我有一个dbo.studies
表,datetime
column studydate
我想使用datetime
变量givendate
查询数据库,以找到最接近datetime
中column studydate
的记录
使用:
SELECT TOP 1 *
FROM studies
WHERE studies.studydate < givendate
ORDER BY studies.studydate DESC
将导致记录离givendate
少且最接近,但我需要记录最接近 givendate
,不管是小于还是大于,然后是studydate
关于如何找到它的任何想法?
答案 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))