Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 两行之间的日期差_Mysql_Sql_Row_Datediff - Fatal编程技术网

Mysql 两行之间的日期差

Mysql 两行之间的日期差,mysql,sql,row,datediff,Mysql,Sql,Row,Datediff,我有一个表,表中有列:用户ID,时间戳和操作 每一行都告诉我哪个用户在某个时间戳执行了什么操作 示例: Alice于2014-06-12 16:37:46开始应用程序 Alice在2014-06-12 17:48:55停止应用程序 我想要一个用户列表,其中包含启动应用程序的第一行与关闭应用程序的最后一行之间的时间差 以下是我试图做到这一点的方式: SELECT USER_ID,DATEDIFF( (SELECT timestamp FROM MOBILE_LOG WHERE ACTI

我有一个
,表中有列:
用户ID
时间戳
操作

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

示例:

  • 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的列表,持续时间为-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";
您可以创建两个“表”,其中每个用户的最早开始时间和最晚结束时间。然后将它们连接起来,以便将同一用户的操作放在一起


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

我认为您应该按用户ID对该表进行分组,并为每个用户找到“启动应用程序”的最短日期和“关闭应用程序”的最长日期。此外,您应该先在关闭应用程序时间中使用,然后在启动应用程序时间中使用。在这种情况下,您将获得正值结果

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

之所以有int值,是因为您使用了函数DATEDIFF,它显示了两个日期之间的天数,如果您想知道必须使用的日期之间的小时数、分钟数和秒数 试试这个:

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
它将显示所有用户的两个最新日期(开始日期、结束日期)之间的差异


对不起,我写的时候没有任何数据库,可能有一些错误。如果(选择…中的
(t1.action,t1.timestamp)有问题,请将其拆分为两个:
其中t1.action(选择…)和t1.timestamp(选择…

您希望如何查看差异?在毫秒或小时内,你就有了一个面具(提供它,类似于:`YYYY-MM-DD HH:MI:SS`)?一个面具就太棒了!DD HH:MM(40天3小时4分钟)不起作用,开始和结束在不同的行中。我收回它。它会起作用的-我完全错过了最后的
小组。非常聪明!请投票支持教我新东西。但是-这将非常缓慢,因为您无法为任何内容编制索引,所以实际上不要这样做,请使用我的方法。这似乎可行,我只是尝试删除新创建的Duration列上的NULL值,但一个简单的WHERE不起作用:(@Mark Use
HAVING
not
WHERE
,因为这种情况发生在
groupby
之后。但我建议您使用我的代码,因为它会运行得更快(除非行数不多,速度无关紧要)。@Ariel您的两种解决方案都能在0.06秒内顺利运行(我有一个小分贝)我真的不知道该接受哪一个答案:-)那不是他问的。你应该自己删除你的答案。他评论说他想看到小时和分钟的差异,不是吗?下次以评论的形式发布(好吧,一旦你有足够的分数这样做)。您的答案中没有任何代码,只是指向其他地方的链接,stackoverflow不喜欢这样的答案。很抱歉,我不擅长SQL查询,您的所有帖子对我都很感兴趣,我正在考虑使用TimeDiff更改我的帖子,第一次阅读您的问题时,我不明白您需要什么。