2012-11-16 4 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 서버 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은 세 가지 시나리오 모두에서 테스트 한 것과 최소 차이를 넘어서 수행됩니다.
+0

예 '넥타이'를 간과했습니다. 그래서 두 가지 결과를 얻습니다. 이것은 대단히 감사합니다. 나는 당신을 사랑한다고 말할 것입니다. 그러나 당신은 저를 잘못되게 할 수 있습니다 :) – nzic