Mysql 如何使用DATEDIFF查找行之间的分钟差异?

Mysql 如何使用DATEDIFF查找行之间的分钟差异?,mysql,sql-server,Mysql,Sql Server,我发现以前的许多主题都解决了这一问题,例如: 然而,我无法理解这是如何工作的。我不是高级或SQL方面的专家,所以这让我很困扰。我在fiddle上创建了以下内容: CREATE TABLE activity ( IDOrder int, IDActivity int, DateActivity DateTime ); INSERT INTO activity (IDOrder, IDActivity, DateActivity) VALUES (1, 1, "2007-04-1

我发现以前的许多主题都解决了这一问题,例如:

然而,我无法理解这是如何工作的。我不是高级或SQL方面的专家,所以这让我很困扰。我在fiddle上创建了以下内容:

CREATE TABLE activity
(
  IDOrder int,
  IDActivity int,
  DateActivity DateTime
);

INSERT INTO activity (IDOrder, IDActivity, DateActivity) VALUES 
(1, 1, "2007-04-16 08:34:00"),
(1, 2, "2007-04-16 09:22:00"), 
(1, 3, "2007-04-16 09:51:00"),
(1, 4, "2007-04-16 16:14:00"), 
(2, 1, "2007-04-16 08:34:00"),
(3, 1, "2007-04-16 08:34:00"), 
(3, 2, "2007-04-16 09:22:00"),
(3, 3, "2007-04-16 09:51:00"), 
(3, 4, "2007-04-16 16:14:00"),
(4, 1, "2007-04-16 08:34:00"), 
(4, 2, "2007-04-16 09:22:00"),
(4, 3, "2007-04-16 09:51:00");

INSERT INTO activity (IDOrder, IDActivity , DateActivity) VALUES 
(2, 2, CURRENT_TIMESTAMP), 
(2, 3, CURRENT_TIMESTAMP);
有人能把我推到正确的方向吗?我想要的输出是4列,以分钟表示这些差异。时间1是IDActivity 1和2之间的差异。时间2是IDActivity 2和3之间的差异。时间3介于3和4之间,时间4介于4和1之间。在IDActivity不存在的某些情况下,我希望它返回null

我最好的想法是使用IF-THEN语句,一个返回4列数据的巨大循环,但我不确定如何实现它。

试试这个:

“timeMinute”列是IDActivity no x和no x+1之间的分钟差 在同一个“IDOrder”中


考虑到案件陈述,你的思路是正确的。我会用我解决这个问题的方法来引导你

我首先编写了一个select查询,该查询使用case语句获取第一、第二、第三和第四个活动日期:

SELECT idorder, 
   (CASE WHEN idactivity = 1 THEN dateactivity ELSE NULL END) AS firstDate,
   (CASE WHEN idactivity = 2 THEN dateactivity ELSE NULL END) AS secondDate,
   (CASE WHEN idactivity = 3 THEN dateactivity ELSE NULL END) AS thirdDate,
   (CASE WHEN idactivity = 4 THEN dateactivity ELSE NULL END) AS fourthDate
FROM activity;
但是,这会为每个组返回一个包含四行的丑陋结果集。第一行有一个firstDate值,其余的为null。第二行有一个secondDate值,第一个、第三个和第四个日期为null。请参阅下面的SQL FIDLE以获取图像

因此,我将其用作子查询,并使用MAX()函数获取每个日期,每个idorder值有一行:

SELECT idorder,
  MAX(firstDate) AS firstDate,
  MAX(secondDate) AS secondDate,
  MAX(thirdDate) AS thirdDate,
  MAX(fourthDate) AS fourthDate
FROM(SELECT idorder, 
     (CASE WHEN idactivity = 1 THEN dateactivity ELSE NULL END) AS firstDate,
     (CASE WHEN idactivity = 2 THEN dateactivity ELSE NULL END) AS secondDate,
     (CASE WHEN idactivity = 3 THEN dateactivity ELSE NULL END) AS thirdDate,
     (CASE WHEN idactivity = 4 THEN dateactivity ELSE NULL END) AS fourthDate
      FROM activity) t
GROUP BY idorder;
然后,我可以修改上面的查询,使用MySQL中的
timestamdiff()
函数以分钟为单位获得差异。但是,您仍然需要计算最大值,只需比较第一个和第二个的最大值,以及第三个和第四个的最大值。看起来是这样的:

SELECT idorder,
  TIMESTAMPDIFF(minute, MAX(firstDate), MAX(secondDate)) AS firstTimeDifference,
  TIMESTAMPDIFF(minute, MAX(thirdDate), MAX(fourthDate)) AS secondTimeDifference
FROM(SELECT idorder, 
     (CASE WHEN idactivity = 1 THEN dateactivity ELSE NULL END) AS firstDate,
     (CASE WHEN idactivity = 2 THEN dateactivity ELSE NULL END) AS secondDate,
     (CASE WHEN idactivity = 3 THEN dateactivity ELSE NULL END) AS thirdDate,
     (CASE WHEN idactivity = 4 THEN dateactivity ELSE NULL END) AS fourthDate
      FROM activity) t
GROUP BY idorder;
这是你的电话号码

编辑


上面没有返回您需要的所有四列,但希望您具备获取其他值所需的技能。

添加预期输出,这将非常有助于理解您的问题对不起,我不确定倒数第二段是否足够清楚。每个IDOrder都与给定的IDActivity和DateActivity关联。我想做的是为每个订单(有4个em),我想创建4列;IDOrder 1的IDActivity 1和IDActivity 2之间的差异是时间列1。对3列执行此操作,即IdaActivity 2/3、IdaActivity 3/4、IdaActivity 4/1。然后,我必须为每个订单执行此操作,因为有4个订单,但它们的IDActivity不一定高达4(在这种情况下,它将返回null…理想情况下)。这说明了吗?再次感谢。你为哪个数据库编码?您同时标记了MySQL和sql server,这非常有意义。是的,我可以通过修改select语句并相应地为时间差添加其他两列来获得其他值列!我不知道有这么多的时间用法;我花了更多的时间思考如何正确使用datediff(基于年份、分钟、日期),我试图先将其转换为分钟。呸。谢谢@YamY书签当我需要操作datetime列时,我总是使用它。@YamY还注意,这些函数是用于MySQL的。您标记了它和sql server,我不确定您在做什么,但会有一些相似之处。不管语法如何,解决此查询背后的逻辑应该是相同的。
SELECT idorder,
  TIMESTAMPDIFF(minute, MAX(firstDate), MAX(secondDate)) AS firstTimeDifference,
  TIMESTAMPDIFF(minute, MAX(thirdDate), MAX(fourthDate)) AS secondTimeDifference
FROM(SELECT idorder, 
     (CASE WHEN idactivity = 1 THEN dateactivity ELSE NULL END) AS firstDate,
     (CASE WHEN idactivity = 2 THEN dateactivity ELSE NULL END) AS secondDate,
     (CASE WHEN idactivity = 3 THEN dateactivity ELSE NULL END) AS thirdDate,
     (CASE WHEN idactivity = 4 THEN dateactivity ELSE NULL END) AS fourthDate
      FROM activity) t
GROUP BY idorder;