В настоящее время я столкнулся со следующей проблемой:
- Я хочу выбрать все записи из таблицы 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, когда время в базе данных на две минуты раньше текущего времени.