MySQL两行之间的日期差异

时间:2014-07-02 08:30:13

标签: mysql sql row datediff

我有TABLE列: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";

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

我是在正确的轨道上吗?

3 个答案:

答案 0 :(得分:3)

我认为您应该按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

SQLFiddle demo

答案 1 :(得分:2)

SELECT user_id, start_time, close_time, DATEDIFF(close_time, start_time) duration
FROM
   (SELECT MIN(timestamp) start_time, user_id FROM MOBILE_LOG WHERE action="START_APP" GROUP BY user_id) start_action
  JOIN
   (SELECT MAX(timestamp) close_time, user_id FROM MOBILE_LOG WHERE ACTION ="CLOSE_APP" GROUP BY user_id) close_action
  USING (user_id)
WHERE USER_ID="Alice";

你制作两张桌子"每个用户的最早开始时间,以及每个用户关闭的最晚时间。然后加入它们,以便同一个用户的动作在一起。

现在您已经完成了所有设置,您可以轻松地在它们之间进行相减。

答案 2 :(得分:2)

你有int值,因为你使用DATEDIFF函数,它会显示两个日期之间的天数,如果你想要使用日期之间的小时数,分钟数和秒数TIMEDIFF 试试这个:

select t1.USER_ID, TIMEDIFF(t2.timestamp, t1.timestamp)
  from MOBILE_LOG  t1, MOBILE_LOG  t2
 where (t1.action,t1.timestamp) in (select action, max(timestamp) from MOBILE_LOG t where t.ACTION = "START_APP" group by USER_ID)
   and (t1.action,t1.timestamp) in (select action, max(timestamp), max(id) from MOBILE_LOG t where t.ACTION = "CLOSE_APP" group by USER_ID)
   and t1.USER_ID = t2.USER_ID

它会显示所有用户的两个最新日期(startdate,enddate)之间的差异。

P.S:对不起,我写的没有任何数据库,可能会有一些错误。如果您遇到问题(t1.action,t1.timestamp) in (select...)将其拆分为两个:where t1.action in (select ...) and t1.timestamp in (select ...)