2

基準時間はあります:

'2012-05-01 23:35:00'

また、「yyyy-MM-dd」の日付部分は無関係ですが、関連するのは「HH:minute」の日付部分であるテーブルからさらに2、3回あります。

------------------------------
| 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関数でこれを行う方法はありますか?

編集:MSSQLServer2005を使用しています

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 に答える