【发布时间】:2011-12-05 17:22:51
【问题描述】:
我有一个网站,我在 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
这个特别返回以下错误:
Msg 535, Level 16, State 0, Line 3 datediff 函数导致 溢出。分隔两个日期/时间的日期部分数 实例太大。尝试使用不太精确的 datediff 日期部分。
所以我想再一次使用 seconds 日期部分,我相信我在正确的轨道上,但不太明白。
帮助表示赞赏。谢谢。
-- 更新--
很好的建议,帮助我认为这种方法是错误的。每次点击都会进行检查。我应该做的是对于给定的时间戳,检查在最后 5 秒内是否记录了来自同一 IP 地址的 5 次点击。所以它就像,计算 > GetDate() - 5 秒的点击次数
尝试以下仍然不能给我一个准确的数字。
SELECT COUNT(*)
FROM UserClicks
WHERE ClickTimeStamp >= GetDate() - DATEADD(SECOND, -5, GetDate())
【问题讨论】:
-
datediff 的问题是它溢出(显然)。您的 startdate 为 0,
ClickTimeStamp为记录的任何日期时间。任何超过大约 68 年的时间间隔与 datepart 作为秒都会有溢出,因为 datediff 返回一个 int。查看更多信息:stackoverflow.com/questions/1275208/… -
请求也存在逻辑问题。假设您有一个在上午 10:00:00 点击的 IP,然后在 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 秒内?根据响应将确定获得结果的方法。
标签: tsql date-parsing datepart