0

現在、次の問題に直面しています。

  • データベース テーブル LocationUpdates から、特定の RFIDTagID および現在の時刻と比較して 2 分より小さい ScannedTime のすべてのレコードを選択したいと考えています。
  • SQL に 2 つのパラメーターを指定しています。1. RFIDTagID (この tagID を持つデータベース内の結果のみを選択する必要があります。
  • ここで、データベースに質問したいと思います。RFIDTagID 123456789 のすべてのレコードを教えてください。最大 2 分前の ScannedTime は、2 番目のパラメーター ScannedTime よりも早くなります。
  • SQL が結果を返す場合: 行を追加しないでください。
  • SQL が結果を返さない場合: 行を追加する必要があります。

このタスクを実行するためのストアド プロシージャを作成しています。次のようになります。

  • 手順の作成
  • SELECT COUNT(*) FROM dbo.LocationUpdates update WHERE updates.RFIDTagID = @RFIDTagID AND DATEDIFF(MINUTE, @ScannedTime, updates.ScannedTime) < 2
  • IF @@ROWCOUNT = 0 THEN いくつかのタスクを実行し、行を追加します
  • それ以外は何もしない

データベースに次のデータがあります。

160 300833B2DDD9014035050005    18-7-2013 11:18:44
161 300833B2DDD9014035050005    18-7-2013 11:19:50
162 300833B2DDD9014035050005    18-7-2013 11:24:03
163 300833B2DDD9014035050005    18-7-2013 13:38:50
164 300833B2DDD9014035050005    18-7-2013 13:39:29
165 300833B2DDD9014035050005    1-1-1900 0:00:00

そして、次のクエリを実行すると(現在の日付で):

DECLARE @return_value Int
DECLARE @currDate DATETIME
SET @currDate = GETDATE()

EXEC    @return_value = [dbo].[INSERT_LOCALROW]
        @RFIDTagID = N'300833B2DDD9014035050005',           
        @ScannedTime = @currDate

SELECT  'Return Value' = @return_value

GO

このクエリは次の結果を返します: 6 行 しかし、現在の時刻と 2 分ずれている結果はないため、返される行は 0 行になると予想しています。

誰か提案がありますか?

編集

私はすでに答えを見つけました:

SELECT COUNT(*) FROM dbo.LocationUpdates updates WHERE updates.RFIDTagID = @RFIDTagID AND DATEDIFF(MINUTE, @ScannedTime, updates.ScannedTime) > -2

関数 DateDiff は、新しい日付と古い日付を比較すると負の整数を返すため、データベースの時刻が現在の時刻より 2 分早い場合は -2 を返します。

4

1 に答える 1

1

私は交換します

DATEDIFF(MINUTE, @ScannedTime, updates.ScannedTime) < 2

2 番目の引数が 3 番目の引数 (日付) より大きい場合、負の結果が得られます。そして... 負の結果は 2 より小さいです。

updates.ScannedTime > DATEADD(MINUTE, -2, @ScannedTime)

またはパラメータを反転

DATEDIFF(MINUTE,  updates.ScannedTime, @ScannedTime) < 2
于 2013-07-19T07:00:41.920 に答える