两行之间的 MySQL 日期差异

Mar*_*ark 3 mysql sql row datediff

我有一个TABLEwith Columns: USER_IDTIMESTAMPACTION

每一行都告诉我哪个用户在某个时间戳做了什么操作。

例子:

  • Alice 于 2014-06-12 16:37:46 开始申请
  • Alice 在 2014-06-12 17:48:55 停止申请

我想要一个用户列表,其中包含启动应用程序的第一行和关闭应用程序的最后一行之间的时间差。

这是我尝试这样做的方法:

    SELECT USER_ID,DATEDIFF(
(SELECT timestamp FROM MOBILE_LOG WHERE ACTION="START_APP" AND USER_ID="Alice"  order by TIMESTAMP LIMIT 1),
(SELECT timestamp FROM MOBILE_LOG WHERE ACTION ="CLOSE_APP" AND USER_ID="Alice"  order by TIMESTAMP LIMIT 1)
) AS Duration FROM MOBILE_LOG AS t WHERE USER_ID="Alice";
Run Code Online (Sandbox Code Playgroud)

我要求两个 SELECT 查询之间的 DATEDIFF,但我只得到一个 Alice`s 的列表,其中 -2 作为 Duration。

我在正确的轨道上吗?

val*_*lex 5

我认为您应该按 USER_ID 对该表进行分组,并为每个用户找到“START_APP”的最小日期和“CLOSE_APP”的最大值。您还应该在DATEDIFF 中先使用CLOSE_APP 时间,然后使用 START_APP 时间,在这种情况下,您将获得正值结果

SELECT USER_ID,
       DATEDIFF(MAX(CASE WHEN ACTION="CLOSE_APP" THEN timestamp END),
                MIN(CASE WHEN ACTION="START_APP" THEN timestamp END)
               ) AS Duration 
FROM MOBILE_LOG AS t 
GROUP BY USER_ID
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo

  • @Mark 使用 `HAVING` 而不是 `WHERE`,因为条件发生在 `GROUP BY` 之后。但是我想建议您使用我的代码,因为它会运行得更快(除非行数不多并且速度无关紧要)。 (2认同)