2012-11-16 40 views
2

我有一个参考时间:优雅的方式来计算最近的一次

'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的

+1

为什么不只是找到绝对差异?最小的数字是最接近的。 –

+0

这是我第一次猜测。让我们在几分钟内完成。所以参考分钟是1415.但是45和1415之间的绝对差值是1370分钟,这根本就是不正确的,因为它应该是70. 然后我开始使用MOD(1440),但它让我离回答更远。 – nzic

+0

我相信接受的答案......确实使用分钟的绝对差异! –

回答

3
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)); 

注:

  1. datediff(d, -datediff(...模式删除从日期时间日期部分。
  2. 要处理交叉午夜场景,除了abs(reftime-coltime)之外,还要测试reftime+1coltime+1
  3. ORDER BY跨越最小差异执行测试它在所有3场景。
+0

是的,我忽视了“与领带”。这就是为什么我得到两个结果。非常感谢你。我会说我爱你,但你可以让我错了:) – nzic

相关问题