Вопрос SQL относительно дат и времени - PullRequest
0 голосов
/ 25 июля 2011

Я хочу создать запрос SQL для БД SQLite3.

В моей таблице есть следующие примеры данных

7/1/2011   8:00   LOGIN
7/1/2011   10:12  LOGOFF
7/1/2011   10:20  LOGIN
7/1/2011   17:15  LOGOFF
7/2/2011   9:00   LOGIN
7/3/2011   10:00  LOGIN
7/3/2011   20:00  LOGOFF

В основном я хочу получить только первую запись LOGIN длядата и последняя запись LOGOFF для той же даты (если доступно)

Поэтому я хочу, чтобы запрос выдал

7/1/2011   8:00   LOGIN
7/1/2011   17:15  LOGOFF
7/2/2011   9:00   LOGIN
7/3/2011   10:00  LOGIN
7/3/2011   20:00  LOGOFF

Также возможно вычислить разницу во времени с желаемым выводомТаблица?

IE / 01.07.2011 будет 9: 15

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Предположим, что ваши столбцы названы Date, Time, Action, вот что вам нужно:

select Date,
       case Action 
         when 'LOGIN' then Min(Time)
         when 'LOGOFF' then Max(Time)
       end as ActionTime,
       Action 
from YourTable
group by Date, Action

Обновление

Для расчета разницы вы можете захотеть "свести "строки дня в одну строку:

select Date, MinLoginTime, MaxLogoffTime, MaxLogoffTime - MinLoginTime as Diff
from
(
select Date,
       Min(
           case Action 
               when 'LOGIN' then Time
               else null
           end
       ) as MinLoginTime,
       Max(
           case Action 
               when 'LOGOFF' then Time
               else null
           end
       ) as MaxLogoffTime
from YourTable
group by Date
) YourDT

Некоторые соображения:

  • Если у вас нет MinLoginTime ИЛИ MaxLogoffTime, Diff будет нулевым
  • Возможно, вам придется поработать над форматированием Diff.Проведите некоторое исследование на этот счет для SQLite, каждая СУБД имеет свои особенности по этому вопросу.
2 голосов
/ 25 июля 2011

Почему бы вам не брать их по одной и той же линии каждый день?

SELECT 
  LogIns.Date, LogInHour, LogOffHour
FROM
  (SELECT Date, MIN(hour) LogInHour
   FROM MyTable
   WHERE action = 'LOGIN'
   GROUP BY Date) LogIns
 LEFT JOIN
  (SELECT Date, MAX(hour) LogOffHour
   FROM MyTable
   WHERE action = 'LOGOFF'
   GROUP BY Date) LogOffs
 ON LogIns.Date = LogOffs.Date

Я использовал LEFT JOIN, потому что вы можете иметь ЛОГИН через день, но не ЛОГОТИП.

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