リンクがクリックされるたびに SQL Server 2008 データベースにクライアント メトリックを記録するサイトがあります。1 日の合計クリック数を取得するためのクエリは既に作成していますが、ユーザーが特定の時間内 (つまり 5 秒以内) にクリックした回数を調べたいと考えています。
ここでの考え方は、コンテンツをスクレイピングしようとしている着信 IP アドレスをロックアウトすることです。5 秒以内に 5 回を超える「クリック」が検出された場合、または特定の IP アドレスからの 1 日のクリック数が一定の値を超えた場合、これはスクレイピングの試みであると見なされます。
次のいくつかのバリエーションを試しました。
-- 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 関数でオーバーフローが発生しました。2 つの日付/時刻インスタンスを区切る日付部分の数が多すぎます。精度の低い datepart で datediff を使用してみてください。
繰り返しになりますが、秒の日付部分を使用したいと思います。これは正しい軌道に乗っていると思いますが、完全には取得できません。
助けていただければ幸いです。ありがとう。
- アップデート -
素晴らしい提案と、アプローチが間違っていると考えるのに役立ちました。チェックはクリックごとに行われます。私がすべきことは、特定のタイムスタンプに対して、過去 5 秒間に同じ IP アドレスから 5 回のクリックが記録されているかどうかを確認することです。> GetDate() - 5 秒のクリック数をカウントします。
以下を試しても、正確な数値が得られません。
SELECT COUNT(*)
FROM UserClicks
WHERE ClickTimeStamp >= GetDate() - DATEADD(SECOND, -5, GetDate())