SQL-запрос для получения среднего времени - PullRequest
1 голос
/ 03 августа 2011

У меня есть 4 столбца в моей базе данных

Имя пользователя, Дата, Время, LoginType

UserName is a varchar field
Date is a date field
Time is a time field (in 24 hour format)
LoginType is a varchar field

LoginType может содержать одну из двух строк "LOGIN", "SHUTDOWN"

Я хочу получить среднее время, в которое кто-то войдет в систему или завершит работу. Я также хочу узнать дельту несвоевременности и преждевременности.

Итак, для этого примера давайте предположим, что студенты должны посещать занятия к 8:30.и должен LOGOFF на 10: 30

Итак, давайте также предположим, что пример данных выглядит следующим образом

George.Lucas 8:45 2011-07-22 LOGIN
Eric.TheRed 9:00 2011-07-22 LOGIN
Dr.Who 9:01 2011-07-22 LOGIN
Dr.Who 11:01 2011-07-22 SHUTDOWN
George.Lucas 11:45 2011-07-22 SHUTDOWN
Eric.TheRed 12:00 2011-07-22 SHUTDOWN
  1. Мы можем видеть, что Джордж опоздал на 15 минут, и он закрылся на 1 час 15 минут позже
  2. Эрик опоздал на 30 минут для входа в систему
  3. Эрик опоздал на 2 часа 30 минут до ОТКЛЮЧЕНИЯ
  4. Доктор, который опоздал на 31 минуту ВХОД
  5. Доктор Ктобыло опоздание на 31 мин. * ВЫКЛЮЧЕНИЕ

Спасибо

1 Ответ

1 голос
/ 03 августа 2011

Это даст вам среднее время, которое данный пользователь потратил между входом в систему и выключением, даже если есть несколько сеансов в течение одного дня, и при условии, что пользователю необходимо завершить работу перед повторным входом в систему:

SELECT login.UserName, 
  AVG(shutdown.Date - login.Date)
FROM table login,
  table shutdown
WHERE login.UserName = shutdown.UserName
      AND login.LoginType = 'LOGIN'
      AND shutdown.LoginType = 'SHUTDOWN'
      AND shutdown.Date = (SELECT MIN(t.Date)
                           FROM table t
                           WHERE t.UserName = login.UserName
                                 AND t.LoginType = 'SHUTDOWN'
                                 AND t.Date > login.Date)
GROUP BY login.UserName;

Чтобы узнать разницу между ожидаемым и эффективным временем входа в систему / завершения работы, вам просто нужно вычесть 8:30 и 10:30 из login.Time и shutdown.Time соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...