2016-04-05 9 views
0

現在、私のdatetimeのうち最も近くにある行をパラメータとして渡す必要があるTSQLストアドプロシージャを作成しています。ここでTSQL - 日付が自分の値の最も近い行を取得します。

は、現在のコードです:ここでは

DECLARE @IdChannel Int 
DECLARE @ExactTime Datetime 

SET @IdChannel = 1 
SET @ExactTime = '2016-01-01 13:31:49.147' 

SELECT TOP 1  
    DER.[DER_DTMODIF] 
FROM   
    [SGPI]..[DER_DECRO_REGIE] DER 
INNER JOIN 
    SGPI..MAI_MACHINE_INPUT MAI ON MAI.MAI_ACTIVE_INPUT = DER.DER_INPUT 
           AND MAI.MAI_MACHINE_ID = DER.DER_MACHINE_ID 
WHERE  
    (@IdChannel IS NULL OR MAI.MAI_RELATIVE_CHA_ID = @IdChannel) 
    AND [DER_DTMODIF] /*is the nearest of @ExactTime*/ 

は私のデータのスナップショットです。 00:17.733:要求は、2016年1月1日14を返さなければなりません

enter image description here

+0

この投稿は見つかりませんでした。私はこれを閉じてもらいたいですか? –

答えて

1

あなたはあなたのクエリでトップ1を持っていますが、何のことで順序を持っていません。あなたが注文することなく、返される行を決定する方法はありません。

どのようにトップ1とこれらの線に沿って何か。

order by ABS(DATEDIFF(second, @ExactTime, DER_DTMODIF)) 
1

使用ORDER BYTOP

SELECT TOP 1 DER.[DER_DTMODIF] 
FROM SGPI..[DER_DECRO_REGIE] DER INNER JOIN 
    SGPI..MAI_MACHINE_INPUT MAI 
    ON MAI.MAI_ACTIVE_INPUT = DER.DER_INPUT AND 
     MAI.MAI_MACHINE_ID = DER.DER_MACHINE_ID 
WHERE (@IdChannel IS NULL OR MAI.MAI_RELATIVE_CHA_ID = @IdChannel) 
ORDER BY ABS(DATEDIFF(ms, DER_DTMODIF, @ExactTime)); 

注:WHERE句に一致するレコードをたくさん持っている場合、これは非効率的である可能性があります。あなたは毎日倍に一致しているだろうことがわかっている場合は、あなたのような何かにWHEREを変更する場合があります

WHERE (@IdChannel IS NULL OR MAI.MAI_RELATIVE_CHA_ID = @IdChannel) AND 
     ABS(DATEDIFF(ms, DER_DTMODIF, @ExactTime)) < 24*60*60*1000 

(これは、一日の一例に過ぎません。)

これが減少するであろうORDER BYで使用されるデータの量が増加し、パフォーマンスが向上する可能性があります。

関連する問題