Sql, чтобы получить количество часов на пользователя в день - PullRequest
0 голосов
/ 11 мая 2019

Таблица ' Log ' имеет следующие столбцы:

SystemName
User
Datetime - it's a timestamp
Status - has the values Start or Stop. 

Мне нужно написать запрос, который даст мне: Количество часов, проведенных на пользователя в день в системе X.

См. Пример данных ниже:

X, Amit, 05/01/2019 08:45:00, Start
X, Amit, 05/03/2019 13:25:00, Stop
X, Dave, 05/01/2019 09:10:35, Start
X, Dave, 05/01/2019 17:35:42, Stop

Выход:

Amit,05/01/2019, 15h
Amit,05/02/2019, 24h
Amit,05/03/2019, 9h
Dave,05/01/2019, 8h

Мой подход до сих пор: Я думал, что могу использовать преимущество или отставание, чтобы получить последовательные времена в одном ряду. Но в случае пользователя Amit, который охватывает несколько дней. Также может быть пользователь, который запускался и останавливался несколько раз в один и тот же день. Даже если я сделаю это, как я могу генерировать часы для дат среди диапазона. Можете ли вы помочь мне.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Поскольку выходные данные состоят из одной строки на пользователя + день, то вам необходимо присоединить данные к календарной таблице дат.

Вам понадобится способ извлечь пары меток времени начала и окончания для данного пользователя, присоединить его к таблице календаря, а затем подсчитать количество часов в этот день между временем начала и окончания. (Счетчик часов может быть использован Пользовательская функция .

Это довольно сложно. Честно говоря, я бы предпочел написать программу на Python для анализа данных, а не делать это через SQL . Это было бы очень просто:

  • Читать начальную строку
  • Считать конец строки
  • Цикл по дням с выводом часов в день (довольно просто в Python)

Иногда лучший молоток - это гаечный ключ. (Перевод: иногда лучше использовать другой инструмент.)

0 голосов
/ 11 мая 2019

Это должно работать.Вы будете получать только потраченные часы, если для одного и того же дня для пользователя существует статус Start и Stop.

SELECT SystemName,[user],
CONVERT(varchar, CAST(Datetime AS DATETIME), 1) Datetime,
DATEDIFF
(
    HH,
    MAX(CASE WHEN Ststus = 'Start' THEN [Datetime] ELSE NULL END ),
    MAX(CASE WHEN Ststus = 'Stop' THEN Datetime ELSE NULL END )
)HourSpent
FROM your_table A
GROUP BY SystemName,[User],
CONVERT(varchar, CAST(Datetime AS DATETIME), 1)
...