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

4

1 回答 1

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. 为了处理跨午夜场景,reftime+1除了coltime+1仅测试abs(reftime-coltime).
  3. ORDER BY是在与在所有 3 个场景中进行测试的最小差异中执行的。
于 2012-11-16T01:46:14.590 回答