Выбор записей моложе 2 минут с помощью DATEDIFF

В настоящее время я столкнулся со следующей проблемой:

  • Я хочу выбрать все записи из таблицы LocationUpdates моей базы данных для определенного RFIDTagID И ScannedTime меньше 2 минут по сравнению с текущим временем.
  • Задаю sql два параметра: 1. RFIDTagID (Нужен для выбора только результатов в базе с этим tagID, 2. ScannedTime (CurrentTimeStamp).
  • Теперь я хочу спросить базу данных: дайте мне все записи для RFIDTagID 123456789, где ScannedTime максимум на 2 минуты раньше, чем второй параметр ScannedTime.
  • Когда SQL возвращает результаты: не добавляйте строку.
  • Когда SQL не возвращает результаты: вам нужно добавить строку.

Я делаю хранимую процедуру для выполнения этой задачи. Это выглядит следующим образом:

  • СОЗДАТЬ ПРОЦЕДУРУ
  • ВЫБЕРИТЕ СЧЕТ(*) ОТ dbo.LocationUpdates обновляет ГДЕ обновляет.RFIDTagID = @RFIDTagID AND DATEDIFF(MINUTE, @ScannedTime, update.ScannedTime) ‹ 2
  • ЕСЛИ @@ROWCOUNT = 0, ТО ВЫПОЛНИТЕ НЕКОТОРЫЕ ЗАДАЧИ И ДОБАВЬТЕ СТРОКУ
  • ИНАЧЕ НИЧЕГО НЕ ДЕЛАТЬ

У меня есть следующие данные в моей базе данных:

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 строк. Но я ожидаю получить в ответ 0 строк, так как ни один из результатов не отличается на две минуты от текущего времени.

У кого-нибудь есть предложения?

ИЗМЕНИТЬ

Я уже нашел ответ:

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

Функция DateDiff дает отрицательное целое число, когда вы сравниваете более новую дату с более старой датой, поэтому она возвращает -2, когда время в базе данных на две минуты раньше текущего времени.


person joostvandriel    schedule 19.07.2013    source источник


Ответы (1)


я бы заменил

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

Потому что, если второй аргумент больше, чем третий аргумент (даты), у вас будет отрицательный результат. И... отрицательный результат меньше 2.

by

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

или инвертировать параметры

DATEDIFF(MINUTE,  updates.ScannedTime, @ScannedTime) < 2
person Raphaël Althaus    schedule 19.07.2013
comment
Спасибо! Я инвертировал параметр, поэтому функция возвращает положительное целое число. Хорошего дня! - person joostvandriel; 19.07.2013