временная разница между строками

0

Я должен выполнить следующий запрос ниже, как показано на рис.1, но то, что я хотел бы сделать, это получить timediff между строками 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

+-----+--------+-------------------------+---------------------+
  • 0
    На какой версии mysql вы работаете?
  • 0
    Я на версии 5.1.73
Теги:
datetime
time

2 ответа

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, чтобы упростить мой код, вам просто нужно добавить их снова. Дайте мне знать, если это поможет. О, и функция DATEIFF MySQL возвращает значение по умолчанию по умолчанию, которое, я думаю, именно то, что вы хотите.

  • 0
    Diff (Days) - необходимо убрать скобки или заключить в одинарные кавычки, чтобы избежать синтаксической ошибки,
  • 0
    Спасибо за внимание @ P.Salmon. Код исправлен: Diff (Days) сбежал.
0

Другой способ сделать это - присвоить номера строк и присоединиться

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)

Обратите внимание, что результат отличается от ожидаемого результата

  • 0
    Спасибо, ребята ... Очень признателен ... Я искал способ сделать это ... Я попробую и вернусь обратно .... Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню