c# - SQL 查询 : How to determine "Seen during N hour" if given two DateTime time stamps?

标签 c# .net sql sqlite

我正在用 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/

相关文章:

c# - 使用 CaSTLe Dynamic Proxy 2 添加额外的接口(interface)?

c# - Unity - 在两个相机上使用渲染纹理时,所有 Canvas 都变得不可见

c# - 从 C#.net 导出 SAS .XPT 文件

SQlite 查询更新列并替换值

Mysql 磁盘空间已满,等待有人释放空间

c# - WPF 数据绑定(bind)到字符串属性

c# - 如何更改 EmguCV 中的反转帧?

c# - Thread.VolatileRead()与Volatile.Read()

.net - 如何获取程序集的最后修改日期?

mysql - 在javafx中过滤要从数据库显示的数据