Решение для MySQL время от времени с использованием 1 столбца

0

Ex.

| ID |   LOGS   |
| 1  |  8:00:00 | --this is time in,
| 1  |  12:00:00| --this is time out,
| 2  |  20:00:00| -- time in,
| 2  |  8:00:00 | -- time out,

Мне нужно решить часы между временем и временем. Время и тайм-аут находятся в 1 колонке. Я новичок в MySQL и хочу практиковать это.

  • 0
    Datediff дает вам функцию для вычитания двух дат. То, что вы не определили, так это то, как вы знаете, какие две даты связаны Если мы предположим, что возрастающая дата в порядке обозначает дату в / из, вы можете смоделировать номер строки с помощью пользовательских переменных и разбить столбец даты на два столбца, а затем использовать разность дат. но до тех пор, пока мы не узнаем, как вы знаете, с какими датами соединяться Я не уверен, как поступить.
  • 0
    у меня есть имя столбца LOG, где time_in и time_out указаны в журнале, как я могу решить для общего количества часов для времени в и тайм-аут, если они найдены в одном столбце ??
Показать ещё 10 комментариев
Теги:

1 ответ

0

Учитывая то, что я знаю до сих пор... (это близко, но учитывая некоторые недостающие компоненты, это технически неразрешимо)

Я не думаю, что это "правильный" ответ, поскольку я не уверен в типе данных журналов и если он содержит поле даты или просто время. если только раз я не уверен, как учитывать количество дней, которые могут быть разными; ни как обрабатывать заказы записей, так как заказ не гарантируется.

Я также не уверен, что у ваших данных отсутствуют пары и как мы справимся с этим. Скажите, что кто-то не входил, а вводил ключ или наоборот. Как мы справляемся с такими ситуациями?

То, что показано ниже, имитирует функциональность row_number с использованием пользовательских переменных (@RN, @RN2) и присваивает каждой записи записи 1,2,3,4.. и т.д. RN. С этим номером строки генерируются два идентичных набора данных. Затем я присоединяюсь к этим наборам данных вместе на DS1.rownumber + 1 = DS2.rownumber и наборе данных. 1 номер строки ограничен только нечетными строками с использованием функции мод. Это означает, что теперь мы можем вычесть дату2 с даты1 и получить разницу.

SELECT ID, Col2DT, Col1DT, timestampDiff(Minute, COl2DT, Col1DT) as MinDiff
FROM (SELECT ID, Logs col1DT , @RN:=@RN+1 RN
      FROM TableName
      CROSS JOIN (SELECT @RN:=0)
      ORDER BY ID, Logs Asc) Der_Tab1
INNER JOIN (SELECT ID, LogsCol2DT, @RN2:=@RN2+1 RN
            FROM TableName
            CROSS JOIN (SELECT @RN2:=0)
            ORDER BY ID, Logs Asc) Der_Tab2
  on Der_tab1.ID = Der_tab2.ID
 and der_tab2.RN+1 = DerTab2.RN
WHERE mod(Der_tab1.RN,2)=1
  • перекрестное соединение просто объявляет и инициализирует пользовательские переменные @RN & @RN2 до 0
  • порядок каждого подзапроса гарантирует, что мы назначим номер правой строки каждому идентификатору, если лог - это тип данных временной метки
  • mod (der_tab1.rn, 2) = 1 гарантирует, что все строки нечетного числа находятся в моем первом наборе данных der_tab1. Это означает, что все четные, основанные на соединении, будут во втором наборе данных (der_tab2), если мы предположим, что каждый идентификатор имеет два входа для входа/выхода без сбоев, тогда этот подход даст нам два значения даты в 1 записи, которую нам нужно вычесть
  • внешний выбор затем выполняет математику и показывает идентификатор, две даты вычитаются и полученная разница в минутах.

Ещё вопросы

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