У меня есть сайт, где я записываю клиентские метрики в базе данных SQL Server 2008 по каждой нажатой ссылке.Я уже написал запрос, чтобы получить общее количество кликов в день, однако я хочу выяснить, сколько раз пользователь нажал за указанный промежуток времени (т. Е. В течение 5 секунд).
Идея заключается в том, чтобы заблокироватьвходящие IP-адреса, которые пытаются очистить содержимое.Предполагается, что если в течение 5 секунд обнаружено более 5 «кликов» или число ежедневных кликов с данного IP-адреса превышает какое-либо значение, это попытка очистки.
Я пробовал несколькоследующие варианты:
-- when a user clicked more than 5 times in 5 seconds
SELECT DATEADD(SECOND, DATEDIFF(SECOND, 0, ClickTimeStamp), 0) as ClickTimeStamp, COUNT(UserClickID) as [Count]
FROM UserClicks
WHERE DATEDIFF(SECOND, 0, ClickTimeStamp) = 5
GROUP BY IPAddress, ClickTimeStamp
Эта ошибка, в частности, возвращает следующую ошибку:
Сообщение 535, Уровень 16, Состояние 0, Строка 3 Функция datediff привела к переполнению,Число частей даты, разделяющих два экземпляра даты / времени, слишком велико.Попробуйте использовать datediff с менее точной частью даты.
Итак, еще раз, я хочу использовать часть даты секунд, которая, как я считаю, находится на правильном пути, но не совсем понимаю.
Помощь приветствуется.Спасибо.
- ОБНОВЛЕНИЕ -
Отличные предложения и помогли мне подумать, что подход неправильный.Проверка будет производиться при каждом нажатии.Что я должен сделать для данной временной отметки, проверить, было ли за последние 5 секунд зарегистрировано 5 щелчков с того же IP-адреса.Так что это будет что-то вроде: посчитайте количество кликов для> GetDate () - 5 секунд
Попытка выполнить следующее все равно не даст мне точную цифру.
SELECT COUNT(*)
FROM UserClicks
WHERE ClickTimeStamp >= GetDate() - DATEADD(SECOND, -5, GetDate())