【问题标题】:timediff between rows行之间的时间差异
【发布时间】:2018-06-21 00:33:52
【问题描述】:

我必须在 fig.1 下面进行查询,这可行,但我想做的是获取第 4 行和第 5 行之间的时间差异,然后得到第 5 行和第 6 行之间的差异.

目标是获得类似 fig.2 的东西,理想情况下,我希望在查询中执行此操作,而不必循环浏览数据库中的每一行然后返回 PHP。

提前致谢。


图1

select * from ModuleFlowModuleStatus where ModuleCode = "LW2205" ORDER BY UpdatedOn;


| ID  | Module | MoudleStatus            | UpdatedOn           |

|   4 | LW2205 | Draft exam received     | 2017-10-18 12:41:12 |

|   5 | LW2205 | Draft exam received     | 2017-10-18 12:41:23 |

|   7 | LW2205 | Draft exam received     | 2017-10-20 15:06:46 |

| 275 | LW2205 | Exam approved by Dean   | 2017-11-14 16:39:28 |

| 288 | LW2205 | Final exam sign off by  | 2017-11-21 12:28:59 |

| 295 | LW2205 | Exam sent to SREO (Stud | 2017-11-23 09:53:30 |

+-----+--------+-------------------------+---------------------+

2 预期结果

| ID  | Module | MoudleStatus            | UpdatedOn           | Diff(days)

|   4 | LW2205 | Draft exam received     | 2017-10-18 12:41:12 | 0

|   5 | LW2205 | Draft exam received     | 2017-10-18 12:41:23 | 0

|   7 | LW2205 | Draft exam received     | 2017-10-20 15:06:46 | 2

| 275 | LW2205 | Exam approved by Dean   | 2017-11-14 16:39:28 | 24

| 288 | LW2205 | Final exam sign off by  | 2017-11-21 12:28:59 | 7

| 295 | LW2205 | Exam sent to SREO (Stud | 2017-11-23 09:53:30 | 3

+-----+--------+-------------------------+---------------------+

【问题讨论】:

  • 你用的是哪个版本的mysql?
  • 我使用的是 5.1.73 版

标签: php mysql sql datetime time


【解决方案1】:

此 SQL 代码应该适用于您应用于图 1 中的表:

SELECT
  t1.ID,
  t1.Module,
  t1.MoudleStatus,
  t1.UpdatedOn,
  IFNULL(DATEDIFF(
    t1.UpdatedOn,
    (SELECT MAX(t2.UpdatedOn) FROM ModuleFlowModuleStatus AS t2 WHERE t2.id < t1.id)
  ), 0) AS `Diff(Days)`
FROM
  ModuleFlowModuleStatus AS t1;

代码可以稍微优化/改进,但它对我有用。我省略了你的 WHERE 和 ORDER BY 子句来简化我的代码,你只需要再次添加它们。让我知道它是否有帮助。哦,MySQL DATEDIFF 函数默认返回天数,我认为这正是您想要的。

【讨论】:

  • Diff(Days) - 需要去掉括号或用单引号括起来以避免语法错误,
  • 感谢@P.Salmon 的提醒。代码更正:Diff(Days) 转义。
【解决方案2】:

另一种方法是分配行号并加入

SELECT T.*, S.RN1,S.UPDATEDON,
         DATEDIFF(t.UPDATEDON,s.UPDATEDON) DIFF
FROM
(
SELECT T.*, 
         IF(T.MODULE <> @P , @RN:=1,@RN:=@RN+1) RN,
         @P:=T.MODULE P
FROM T
CROSS JOIN (SELECT @RN:=0,@P:='') R
where t.Module = 'LW2205'
order by t.module, t.id
)T 
LEFT JOIN
( 
SELECT T.*, 
         IF(T.MODULE <> @P1 , @RN1:=1,@RN1:=@RN1+1) RN1,
         @P1:=T.MODULE P1
FROM T
CROSS JOIN (SELECT @RN1:=0,@P1:='') R
where t.Module = 'LW2205'
order by t.module, t.id
) S
ON S.RN1 = T.RN - 1 AND S.MODULE = T.MODULE;

结果

+------+--------+-------------------------+---------------------+------+--------+------+---------------------+------+
| ID   | Module | MoudleStatus            | UpdatedOn           | RN   | P      | RN1  | UPDATEDON           | DIFF |
+------+--------+-------------------------+---------------------+------+--------+------+---------------------+------+
|    4 | LW2205 | Draft exam received     | 2017-10-18 12:41:12 |    1 | LW2205 | NULL | NULL                | NULL |
|    5 | LW2205 | Draft exam received     | 2017-10-18 12:41:23 |    2 | LW2205 |    1 | 2017-10-18 12:41:12 |    0 |
|    7 | LW2205 | Draft exam received     | 2017-10-20 15:06:46 |    3 | LW2205 |    2 | 2017-10-18 12:41:23 |    2 |
|  275 | LW2205 | Exam approved by Dean   | 2017-11-14 16:39:28 |    4 | LW2205 |    3 | 2017-10-20 15:06:46 |   25 |
|  288 | LW2205 | Final exam sign off by  | 2017-11-21 12:28:59 |    5 | LW2205 |    4 | 2017-11-14 16:39:28 |    7 |
|  295 | LW2205 | Exam sent to SREO (Stud | 2017-11-23 09:53:30 |    6 | LW2205 |    5 | 2017-11-21 12:28:59 |    2 |
+------+--------+-------------------------+---------------------+------+--------+------+---------------------+------+
6 rows in set (0.00 sec)

请注意结果与您的预期结果不同

【讨论】:

  • 谢谢大家...非常感谢...我正在寻找一种方法来做到这一点...我会尝试并恢复...谢谢
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多