2

I am divided between using a C# implementation and a pure SQL 2005/2008 implementation. I need to determine the length of usage based on timestamps of their last actions. My table contains "friendID" (uniqueIdentifier) and "lastAction" datetime. Here is an example:

Bob, 1:00 PM 
Bob, 1:01 PM 
Bob, 1:20 PM 
Bob, 1:25 PM 
Jack, 5:00 PM
Bob, 11:20 PM

I want to "time out" a user if they had 60 minutes of inactivity. If your suggestion works correctly, there should be 3 separate sessions from the data above. There is a long break between Bob's session that started at 1 PM and the one that started at 11:20 PM.

Correct results should be: Bob (duration 25 minutes), Jack (duration 0 minutes), Bob (duration 0 minutes)

How would you return those 3 rows using pure SQL or C#?

Thank you very much for your help, it is really needed here.

4

3 回答 3

1

这是一个纯 SQL 示例:

如果您只需要会话的开始时间:

    选择你,t       
    从测试 a        
    不存在的地方(
      选择 1
      从测试 b
      其中 au = bu
      和 bt >= at - '60 分钟'::interval
      和BT

如果您确实需要会话持续时间:

    选择 au, at, ct
    从测试 a,测试 c
    不存在的地方(
      选择 1
      从测试 b
      其中 au = bu
      和 bt >= at - '60 分钟'::interval
      和BT CT)
    和 au = cu
    并且在
于 2008-12-22T02:36:09.663 回答
1

这听起来像一个简单的问题,除非我误解了这个问题:

select friendId, max(lastAction) 'lastAction'
  from myTable
  where lastAction >= dateadd(day, -1, getdate())
      -- don't analyze data over 24 hours old
  group by friendId
  having max(lastAction) < dateadd(minute, -60, getdate())

这将返回在过去 24 小时内(但不是在过去 60 分钟内)有活动的所有朋友。

于 2009-04-22T19:30:05.690 回答
0

记录会话中第一个动作的开始时间。记录会话中的最后时间。查看 te Globals.asax 事件。应该有类似 OnSessionEnd 的东西(如果有人知道确切的事件,请发表评论)。发生这种情况时,记录开始时间和上次之间的持续时间。如果您不使用 ASP.Net,那么 WinForms 中应该有等效的事件。

现在,处理 60 分钟超时的最简单方法就是在 web.config 中设置它。如果您不想这样做,那么当您保存当前日期以处理此问题时,您将必须有一些逻辑。比如,如果新的当前日期距离旧日期超过 60 分钟,则记录旧的持续时间,然后将开始日期和当前日期重置为现在。

于 2008-12-19T10:16:58.740 回答