我有一个引用时间:
'2012-05-01 23:35:00'
我在某个表中还有几次,其中“yyyy-MM-dd”日期部分不相关,但相关的是带有“HH:分钟”的日期部分
------------------------------
| ID | Time |
| -- |-----------------------|
| 01 | '1900-01-01 13:10:00' |
| 02 | '1900-01-01 07:01:00' |
| 03 | '1900-01-02 00:45:00' |
| 04 | '1900-01-02 18:00:00' |
------------------------------
我正在编写一个函数,该函数将返回时间最接近的行(在上面的示例中,这将是 ID 03),但我不喜欢我正在编写的内容。
所以我开始以图形方式观察问题。有没有办法用 Atan 函数来做到这一点?
编辑:我正在使用 MSSQL server 2005
最佳答案
declare @reftime datetime;
set @reftime = '20120501 23:00:00';
select TOP(1) with ties
id, time
from (
select
t.*,
dateadd(d, -datediff(d, 0, @reftime), @reftime) reftime,
dateadd(d, -datediff(d, 0, t.time), t.time) coltime
from tbl t
) x
order by (select min(diff)
from
(select abs(datediff(ms, reftime, coltime))
union all
select abs(datediff(ms, reftime+1, coltime))
union all
select abs(datediff(ms, reftime, coltime+1))) y(diff));
注释:
datediff(d, -datediff(...
) 模式从日期时间中删除日期部分。- 为了处理跨午夜场景,除了
abs(reftime-coltime)
之外,还测试了reftime+1
和coltime+1
>. ORDER BY
是在所有 3 个场景中测试的最小差异范围内执行的。
关于sql - 计算最近时间的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409082/