Как получить минимальное время заезда и максимальное время выезда из таблицы? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть таблица, в которой хранится регистрация сотрудников и проверка сотрудников. Теперь данные хранятся в 2 разных столбцах и в 2 строках, как показано ниже. Если сотрудник регистрируется на 2019-09-01 21:30:00 и выдает на 2019-09-02 08:45:00, это показывает, что общее количество часов рассчитывается в отрицательном выражении.

Вот данные:

DROP TABLE TestAtte;
CREATE TABLE TestAtte(
    ID INT,
    TimeIn DATETIME,
    TimeOut DATETIME
);

INSERT INTO TestAtte VALUES(1, '2019-09-01 21:30:00', NULL);
INSERT INTO TestAtte VALUES(2, NULL, '2019-09-02 08:48:00');
INSERT INTO TestAtte VALUES(3, '2019-09-03 17:16:00', NULL);
INSERT INTO TestAtte VALUES(4, NULL, '2019-09-04 09:14:00');

Мой запрос выглядит примерно так

SELECT MIN(TimeIn) Checkin, MAX(Timeout) CheckOut
FROM dbo.TestAtte
GROUP BY CAST(COALESCE(TimeIn, Timeout) AS DATE)

Данные должны быть примерно такими:

TimeIn                      TimeOut
2019-09-01 21:30:00.000     2019-09-02 08:48:00.000
2019-09-03 17:16:00.000     2019-09-04 09:14:00.000

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Вероятно, вы можете использовать функцию LAG для этого:

WITH cte AS (
    SELECT LAG(TimeIn) OVER (ORDER BY COALESCE(TimeIn, TimeOut)) AS TimeIn2
         , TimeOut
    FROM TestAtte
)
SELECT TimeIn2, TimeOut
FROM cte
WHERE TimeOut IS NOT NULL

Если в таблице содержатся записи для нескольких сотрудников, вам нужно PARTITION BY EmployeeID внутри предложения OVER. Результаты будут содержать TimeIn = NULL для бесхозных записей TimeOut.

0 голосов
/ 30 сентября 2019

Используется Outer Apply, чтобы найти первый тайм-аут после каждого входа.

SELECT CheckIn.TimeIn, CheckOut.TimeOut
FROM dbo.TestAtte AS CheckIn
OUTER APPLY
(
SELECT TOP 1 TimeOut
FROM dbo.TestAtte AS AllOut
WHERE AllOut.TimeOut > CheckIn.TimeIn
ORDER BY AllOut.TimeOut ASC
) AS CheckOut
WHERE TimeIn IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...