我正在编写一个基于SQLite数据库的统计应用程序。有一张记录用户登入和登出时间(SessionStart,SessionEnd DateTimes)的表格。
我需要查询显示用户在哪些时段已经登陆过,并以折线图的方式展示。例如,在12:00至1:00 AM之间,有60个用户(随时)登陆了,在1:00至2:00 AM之间,有54个用户登陆了等等。
我也想能够运行一个总计数功能,这就是为什么我不能将记录带入.NET并通过迭代进行处理的原因。
我想出了一个相对简单的方法,即每天的每个小时都做一个子查询,但是这种方法被证明速度非常慢。 我需要能够在瞬间计算出几十万条记录的结果。
我需要查询显示用户在哪些时段已经登陆过,并以折线图的方式展示。例如,在12:00至1:00 AM之间,有60个用户(随时)登陆了,在1:00至2:00 AM之间,有54个用户登陆了等等。
我也想能够运行一个总计数功能,这就是为什么我不能将记录带入.NET并通过迭代进行处理的原因。
我想出了一个相对简单的方法,即每天的每个小时都做一个子查询,但是这种方法被证明速度非常慢。 我需要能够在瞬间计算出几十万条记录的结果。
SELECT
case
when (strftime('%s',datetime(date(sessionstart), '+0 hours')) > strftime('%s',sessionstart)
AND strftime('%s',datetime(date(sessionstart), '+0 hours')) < strftime('%s',sessionend))
OR (strftime('%s',datetime(date(sessionstart), '+1 hours')) > strftime('%s',sessionstart)
AND strftime('%s',datetime(date(sessionstart), '+1 hours')) < strftime('%s',sessionend))
OR (strftime('%s',datetime(date(sessionstart), '+0 hours')) < strftime('%s',sessionstart)
AND strftime('%s',datetime(date(sessionstart), '+1 hours')) > strftime('%s',sessionend))
then 1 else 0 end as hour_zero,
... hour_one,
... hour_two,
........ hour_twentythree
FROM UserSession
我想知道有什么更好的方法来确定两个日期时间是否在某个小时内出现过(最好的情况是,如果它在多个日期中被记录,它已经穿过了几次小时,但这不是必要的)?
我唯一想到的另一个想法是创建一个针对此特定目的的“小时”表,并在运行时累加用户出现的小时数,但我觉得这比先前的SQL更像是一种hack。
任何帮助都将不胜感激!