Ввод времени в SQL Server 2005 и выход из времени даже - PullRequest
2 голосов
/ 23 августа 2011

У меня есть две таблицы, dbo.EMP и dbo.EVENTS, со следующими данными:

CREATE TABLE dbo.EMP
(
    ID INT PRIMARY KEY,
    firstname NVARCHAR(64),
    lastname  NVARCHAR(64)
);

INSERT dbo.EMP SELECT 3370,'Ahmad','Gani';

CREATE TABLE dbo.EVENTS
(
    cardnum   INT, 
    eventime  SMALLDATETIME
);

INSERT dbo.Events
          SELECT 3370,'2011-08-01 07:55:00'
UNION ALL SELECT 3370,'2011-08-01 09:50:00'
UNION ALL SELECT 3370,'2011-08-01 13:30:00'
UNION ALL SELECT 3370,'2011-08-01 16:35:00'
UNION ALL SELECT 3370,'2011-08-02 07:45:00'
UNION ALL SELECT 3370,'2011-08-02 10:55:00'
UNION ALL SELECT 3370,'2011-08-02 12:07:00'
UNION ALL SELECT 3370,'2011-08-02 15:07:00'
UNION ALL SELECT 3370,'2011-08-02 16:30:00'
UNION ALL SELECT 3370,'2011-08-03 08:07:00'
UNION ALL SELECT 3370,'2011-08-03 12:07:00'
UNION ALL SELECT 3370,'2011-08-03 15:57:00';

С чего начать с запроса SQL Server 2005?

Я хочуполучить результаты:

cardnum   lastname  time_entry              time_exit
3370      Gani      2011-08-01 07:55:00     2011-08-01 16:35:00
3370      Gani      2011-08-02 07:45:00     2011-08-02 16:30:00
3370      Gani      2011-08-03 08:07:00     2011-08-03 15:57:00

, чтобы каждая строка содержала cardnum, фамилию и два значения из столбца eventime.Первое значение из столбца eventie должно быть первой записью на определенную дату, а второе значение должно быть последней записью на эту конкретную дату, где cardnum одинаково.

1 Ответ

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

Новый запрос с учетом информации, добавленной в комментариях:

;WITH x(cardnum, dt, time_entry, time_exit) AS 
(
  SELECT cardnum, DATEDIFF(DAY, 0, eventime), 
    MIN(eventime), MAX(eventime)
  FROM dbo.EVENTS

  -- EDIT for more new requirements - for July 2011:

  WHERE eventime >= '20110701'
  AND eventime < '20110801'

  GROUP BY cardnum, DATEDIFF(DAY, 0, eventime)
)
SELECT x.cardnum, e.lastname, x.time_entry, x.time_exit
FROM x INNER JOIN dbo.EMP AS e
ON x.cardnum = e.ID;

Вот как @Andriy предложил бы это:

SELECT ev.cardnum, e.lastname, MIN(ev.eventime), MAX(ev.eventime)
  FROM dbo.EVENTS AS ev
  INNER JOIN dbo.EMP AS e
  ON ev.cardnum = e.ID
  GROUP BY ev.cardnum, e.lastname, DATEDIFF(DAY, 0, ev.eventime);

Однако я нахожу это менее интуитивным. Хотя планы с таким небольшим размером данных практически идентичны (немного другое расположение агрегата потока, но я не уверен, насколько хуже будет работать оператор сортировки в большем масштабе, и я понятия не имею, какие индексы находятся в таблице), и Число символов @ Andriy, очевидно, ниже (317 символов против 204), его группировка семантически смешана с присоединением, и я не думаю, что все пользователи найдут интуитивно понятным видеть столбец GROUP BY, который не находится список SELECT. Конечно, это в основном субъективные причины.

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