我正在用 SQLite 数据库编写一个基于统计的应用程序。有一个表记录用户何时登录和注销(SessionStart,SessionEnd DateTimes)。
我正在寻找的是一个查询,它可以显示用户已经登录的时间,以某种折线图的方式 - 所以在 12:00 到凌晨 1:00 之间有 60 个用户登录(在任何时候),在凌晨 1:00 到 2:00 之间有 54 个用户登录,等等......
我希望能够对此进行 SUM,这就是为什么我不能将记录带入 .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。
如有任何帮助,我们将不胜感激!
最佳答案
在 Sybase(T-SQL 方言)上玩了一下,想出了这个查询。
SELECT
StartHour AS Hour, COUNT(*) AS SessionCount
FROM
(SELECT
CONVERT(DATETIME, '2001-01-01 ' + Hour + ':00:00') as StartHour,
DATEADD(HH, 1, CONVERT(DATETIME, '2001-01-01 ' + Hour + ':00:00')) as EndHour
FROM
(SELECT '00' AS Hour UNION ALL SELECT '01' AS Hour UNION ALL
SELECT '02' AS Hour UNION ALL SELECT '03' AS Hour UNION ALL
SELECT '04' AS Hour UNION ALL SELECT '05' AS Hour UNION ALL
SELECT '06' AS Hour UNION ALL SELECT '07' AS Hour UNION ALL
SELECT '08' AS Hour UNION ALL SELECT '09' AS Hour UNION ALL
SELECT '10' AS Hour UNION ALL SELECT '11' AS Hour UNION ALL
SELECT '12' AS Hour UNION ALL SELECT '13' AS Hour UNION ALL
SELECT '14' AS Hour UNION ALL SELECT '15' AS Hour UNION ALL
SELECT '16' AS Hour UNION ALL SELECT '17' AS Hour UNION ALL
SELECT '18' AS Hour UNION ALL SELECT '19' AS Hour UNION ALL
SELECT '20' AS Hour UNION ALL SELECT '21' AS Hour UNION ALL
SELECT '22' AS Hour UNION ALL SELECT '23' AS Hour) AS Hours
) AS T1,
UserSession AS T2
WHERE
-- Logged on during, logged off during
(T2.SessionStart >= T1.StartHour AND T2.SessionEnd < T1.EndHour)
-- Logged on before, logged off during
OR (T2.SessionStart < T1.StartHour AND T2.SessionEnd >= StartHour AND T2.SessionEnd < T1.EndHour)
-- Logged on during, logged off after
OR (T2.SessionStart >= T1.StartHour AND T2.SessionStart < T1.EndHour AND T2.SessionEnd >= T1.EndHour)
-- Logged on before, logged off after
OR (T2.SessionStart < T1.StartHour AND T2.SessionEnd >= T1.EndHour)
GROUP BY
T1.StartHour
ORDER BY
T1.StartHour
所需的输入是要以 YYYY-MM-DD 形式聚合的日期。请注意,对于计数为零的小时,它不会返回任何结果。
关于c# - SQL 查询 : How to determine "Seen during N hour" if given two DateTime time stamps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2471316/