Определение продолжительности посещения пользователя на основе временных отметок SQL - PullRequest
2 голосов
/ 19 декабря 2008

Я разделен между использованием реализации C # и реализацией чистого SQL 2005/2008. Мне нужно определить продолжительность использования на основе отметок времени их последних действий. Моя таблица содержит "friendID" (uniqueIdentifier) ​​и "lastAction" datetime. Вот пример:

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

Я хочу «отключить» пользователя, если у него было 60 минут бездействия. Если ваше предложение работает правильно, должно быть 3 отдельных сеанса из данных выше. Между сеансом Боба, который начался в 13:00, и тем, который начался в 23:20, есть длинный перерыв.

Правильные результаты должны быть: Боб (продолжительность 25 минут), Джек (продолжительность 0 минут), Боб (продолжительность 0 минут)

Как бы вы вернули эти 3 строки, используя чистый SQL или C #?

Большое спасибо за вашу помощь, она действительно нужна здесь.

Ответы [ 3 ]

1 голос
/ 22 декабря 2008

Вот пример чистого SQL:

Если вам нужно только время начала сеанса:

    select u, t       
    from test a        
    where not exists (
      select 1
      from test b
      where a.u = b.u
      and b.t >= a.t - '60 minutes'::interval
      and b.t 

Если вам действительно нужна продолжительность сеанса:

    select a.u, a.t, c.t
    from test a, test c
    where not exists (
      select 1
      from test b
      where a.u = b.u
      and b.t >= a.t - '60 minutes'::interval
      and b.t  c.t)
    and a.u = c.u
    and a.t 
1 голос
/ 22 апреля 2009

Звучит как простая проблема, если я не понимаю вопрос:

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 минут.

0 голосов
/ 19 декабря 2008

Запишите время начала первого действия в сеансе. Запишите последний раз в сессии, а также. Посмотрите на те события Globals.asax. Там должно быть что-то вроде OnSessionEnd (Если кто-то знает точное событие, пожалуйста, прокомментируйте). Когда это произойдет, запишите длительность между временем запуска и в последний раз. Если вы не используете ASP.Net, то в WinForms должны быть эквивалентные события.

Теперь, самый простой способ справиться с 60-минутным тайм-аутом - просто установить его в web.config. Если вы не хотите этого делать, вам понадобится логика при сохранении текущей даты, чтобы справиться с этим. Например, если новая текущая дата составляет более 60 минут от старой, запишите старую длительность, а затем сбросьте начальную и текущую даты до настоящего момента.

...