我有一个网站,我记录每个链接点击SQL Server 2008数据库中的客户端指标。我已经编写了查询来获得每日总点击量,但是我想知道用户在给定时间范围内点击了多少次(即在5秒内)。每日用TSQL计数?
这里的想法是锁定尝试刮擦内容的传入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
这一个特别的回报以下错误:
Msg 535, Level 16, State 0, Line 3 The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
所以再次,我想用秒日期部分,其我相信我走在正确的轨道上,但还没有完全实现。
帮助赞赏。谢谢。
- 更新 -
很好的建议,帮助我认为这种方法是错误的。检查将在每次点击时进行。我应该做的是给定的时间戳,检查是否在最近5秒内从相同的IP地址记录了5次点击。所以它会是这样的,计算> GetDate()的点击次数 - 5秒
尝试以下仍然没有给我一个准确的数字。
SELECT COUNT(*)
FROM UserClicks
WHERE ClickTimeStamp >= GetDate() - DATEADD(SECOND, -5, GetDate())
与datediff的问题是它溢出(显然)。您的startdate为0,并且记录了任何日期时间的'ClickTimeStamp'。任何超过约68年的与datepart的时间差(秒)都会有溢出,因为datediff会返回int。有关它的更多信息,请参见:http://stackoverflow.com/questions/1275208/sql-server-datediff-function-resulted-in-an-overflow – king14nyr
该请求也存在逻辑问题。假设你的IP在10:00:00 AM点击,然后在10:00:01和10:00:04之间点击3次。然后在10:00:07再次。您的输出包含(1 + 3)的计数,忽略10:00:07还是1 + 3 + 1,因为10:00:07在10:00:04的5秒内?取决于响应将决定获得结果的方法。 – xQbert