【问题标题】:How to get the user activity time? [closed]如何获取用户活动时间? [关闭]
【发布时间】:2016-01-28 19:12:10
【问题描述】:

我想获取一个用户的活动时间..

比如他什么时候离开,什么时候回来,离开了多长时间

表格看起来像这样..

id  deviceid    time      status

11  123-123     09:59     1
12  123-123     10:00     0
13  123-123     10:02     0
14  123-123     10:03     0
15  123-123     10:04     0 
16  123-123     10:05     1

10:00 他走了.. 10:05 他又上线了.. 我想计算他不在的时间..

编辑:

status = 0 表示用户不在。 status = 1 表示他在线..

【问题讨论】:

  • 你所说的“离开”和“回来”到底是什么意思?你的意思是说他在身体上离开了他的电脑/手机/平板电脑吗?他把目光从他的电脑/手机/平板电脑上移开看一会儿电视?或者他离开你的网站又回来了?或者从他的网络浏览器窗口切换?还有什么?
  • 将记录写入数据库表是最简单的部分。任何教程都可以帮助您。但是您希望在这里回应哪些实际事件?您如何定义“离开”和“回来”这两个术语?
  • 喜欢走开意味着..每个人的手机中都安装了一个应用程序..它会检测他们的位置..如果有人不在他们的位置上,它会更新状态,因为“离开”意味着 0表..当他们回到他们的位置时,它会更新状态,因为“在线”表示此表中的 1
  • 在我看来,根据您上面的评论,您的数据库中还需要一些列。您有时间(这是当前时间),我认为您需要一个存储状态变为 0 的时间的列,一个在状态变为零时更新的时间戳列,然后是另一个告诉您时间差的列介于时间和新时间列之间。
  • 那你需要做一个孤岛类型的查询。这方面有几十个例子。困难的部分有时只是知道要搜索什么。看看它,看看你能找到什么。

标签: asp.net sql-server database c#-4.0


【解决方案1】:

听起来您正在寻找解决方案。那太棒了。通过解决具有挑战性的问题,我们都能学到最多的东西。只是为了好玩(我在项目之间有几分钟的时间)我把一个工作示例放在一起。我添加了一些额外的示例数据并进行了注释。

我从 Jeff Moden 那里学到了这类东西。他在这里有一篇关于它的文章。 http://www.sqlservercentral.com/articles/T-SQL/71550/

if OBJECT_ID('tempdb..#Something') is not null
    drop table #Something

create table #Something
(
    ID int
    , deviceid varchar(10)
    , StatusTime time
    , IsOnline bit
)

insert #Something
select 11, '123-123', '09:59', 1 union all
select 12, '123-123', '10:00', 0 union all --added by me
select 12, '123-123', '10:01', 0 union all
select 13, '123-123', '10:02', 0 union all
select 14, '123-123', '10:03', 0 union all
select 15, '123-123', '10:04', 0 union all
select 16, '123-123', '10:05', 1 
-- added some extra data here to simulate multiple groups
union all
select 17, '123-123', '10:06', 0 union all
select 18, '123-123', '10:07', 0 union all
select 19, '123-123', '10:08', 0 union all
select 20, '123-123', '10:09', 1 union all
select 21, '123-123', '10:10', 0 --This demonstrates that if the last value is away it will still count it as 1
;

with GroupedDates as
(
    select
        *
        , DATEADD(minute, - ROW_NUMBER() over(partition by deviceid order by StatusTime), StatusTime) as DateGroup
    from #Something
    where IsOnline = 0
)

select MIN(StatusTime) as StartTime
    , MAX(StatusTime) as EndTime
    , DATEDIFF(Minute, MIN(StatusTime), MAX(StatusTime)) + 1 as MinutesAway
from GroupedDates
group by DateGroup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多