У меня есть таблица для хранения посещаемости сотрудников, проверить и проверить соответственно. Большинство людей работают в дневную смену, а большинство работают на ночь. Для тех, кто работает в дневное время, он хорошо рассчитывает и показывает данные, но для тех, кто работает всю ночь, я могу получить точную посещаемость для них. Вот структура и пример данных
CREATE TABLE Shifts
(
ID INT PRIMARY KEY,
ShiftName VARCHAR(25),
StartTime TIME,
EndTime TIME,
IsNightShift bit
)
INSERT INTO Shifts VALUES (1, 'Day Shift', '09:00:00', '18:00', 0);
INSERT INTO Shifts VALUES (2, 'Night Shift', '21:00:00', '05:00', 1);
CREATE TABLE Attendance
(
ID INT,
EmpCode INT,
ShiftCode INT,
CheckIn DATETIME,
CheckOut DATETIME,
CONSTRAINT FK_PersonOrder FOREIGN KEY (ShiftCode)
REFERENCES Shifts(ID)
)
INSERT INTO Attendance VALUES (1, 12, 1, '2019-09-01 09:16:23', NULL)
INSERT INTO Attendance VALUES (2, 12, 1, NULL, '2019-09-01 18:01:56')
INSERT INTO Attendance VALUES (3, 07, 2, '2019-09-01 21:00:00', NULL)
INSERT INTO Attendance VALUES (4, 07, 2, NULL, '2019-09-02 08:48:21')
INSERT INTO Attendance VALUES (5, 12, 1, '2019-09-02 09:27:00', NULL)
INSERT INTO Attendance VALUES (6, 12, 1, NULL, '2019-09-02 18:45:00')
INSERT INTO Attendance VALUES (7, 07, 2, '2019-09-02 21:19:17', NULL)
INSERT INTO Attendance VALUES (8, 07, 2, NULL, '2019-09-02 23:30:56')
INSERT INTO Attendance VALUES (9, 07, 2, '2019-09-03 00:23:00', NULL)
INSERT INTO Attendance VALUES (10, 07, 2, NULL, '2019-09-03 07:19:00')
Я хочу узнать, сколько раз в день сотрудник регистрировался или проверялся, а также для сотрудника 07
, когда я собираюсь получить посещаемость для'2019-09-02'
это должно показать следующий набор результатов. Это означает, что сотрудник сначала зарегистрировался в 9:19 вечера по номеру 2019-09-02
, затем ушел на некоторое время в 23:30, затем снова вернулся в 12:23 AM
, а затем ушел утром в 07:19 AM
. Поскольку время его смены составляет от 09:00 PM
до 05:00 AM
, поэтому он может работать в течение ночи, а посещаемость будет учитываться как 2019-09-02
EmpCode CheckIn
07 2019-09-02 21:19:17
07 2019-09-03 00:23:00
EmpCode CheckOut
07 2019-09-02 23:30:56
07 2019-09-03 07:19:00
Я использую эти запросы для получения набора результатов.
DECLARE @givenDate DATE = '2019-09-02';
DECLARE @EmpCode INT = 07;
SELECT ROW_NUMBER() OVER(ORDER BY CheckIn) AS RowNum, EmpCode, CheckIn
FROM Attendance, Shifts
WHERE Attendance.ShiftCode = Shifts.ID AND
CAST(CheckIn AS DATE) = CAST(@givenDate AS DATE) AND EmpCode=@EmpCode
AND CheckIn IS NOT NULL;
SELECT ROW_NUMBER() OVER(ORDER BY CheckOut) As RowNum, EmpCode, CheckOut
FROM Attendance, Shifts
WHERE Attendance.ShiftCode = Shifts.ID AND
CAST(CheckOut AS DATE) =
CASE WHEN IsNightShift = 1 THEN DATEADD(DAY, 1, CAST(@givenDate AS DATE)) ELSE CAST(@givenDate AS DATE) END
AND EmpCode=@EmpCode
Обратите внимание, что я не использую тайминги Shift в своем запросе, может быть, кто-то может помочь мне, как я могу сделать это удобным, и это может помочь мне получить желаемый набор результатов.