Member 12314309 Ответов: 1

Как добавить ежедневную дату для каждого сотрудника в таблицу посещаемости ?


Я разработал процедуру с помощью Вас...теперь мне нужно руководство ,что когда я импортирую посещаемость данных сотрудника в таблицу sql, то я хочу генерировать ежедневную дату для каждого сотрудника в таблице в соответствии с диапазоном дат, хотя посещаемость во время и вне работы доступна или нет сотрудника, но дата должна генерироваться для тех сотрудников, которые находятся в статусе присоединившихся.,

Что я уже пробовал:

я попробовал тех сотрудников ,которые отсутствуют средства intime и out time не приходят, то их запись приходит с помощью right Join, но я хочу, чтобы ежедневная дата для каждого сотрудника была сгенерирована ....в связи с этим нужна ваша помощь...спасибо

<pre>;With CTE As
    (
    select EmployeeDetails.EmpID,EmployeeDetails.EmpName,EmployeeDetails.OTEntitled,EmployeeDetails.Empcur,EmployeeDetails.Dhour,EmployeeDetails.LTime from EmployeeDetails where Empcur='Join'
    )
    ,CTE4 As
    (
    Select MachineAttendance.EmpID,MachineAttendance.Datetime,MachineAttendance.INOUT from MachineAttendance
    ) 
    ,cte1 AS
    (
    SELECT CTE4.EmpID, CAST(CTE4.Datetime as Date) AS [Date], 
    CASE WHEN CTE4.INOUT = 1 THEN CTE4.DateTime END AS INOUT_INTIME,
    CASE WHEN CTE4.INOUT = 2 THEN CTE4.DateTime END AS INOUT_OUTTIME
    From 
     CTE4
    
    ), 
   cte2 
    as
    (
    select cte1.EmpID, Date, MAX(INOUT_INTIME) AS INTIME, 
                          MAX(INOUT_OUTTIME) AS OUTTIME
    , DATEDIFF(Hour, MAX(INOUT_INTIME), MAX(INOUT_OUTTIME)) as [Hours]
    FROM CTE1
    GROUP BY EmpID, [Date]
    )
    select cte.EmpID,cte.EmpName,cte2.Date, cte.OTEntitled,CTE.Empcur,CTE.Dhour,cte.LTime,cte2.INTIME,  cte2.OUTTIME,  cte2.[Hours]
    , CASE WHEN  cte2.[Hours] >= 8 THEN 1
    WHEN  cte2.[Hours] = 0 THEN 0
    WHEN  cte2.[Hours] >= 6 THEN 0.5 END AS [Day],
    CASE WHEN  cte2.[Hours] > CTE.Dhour then  cte2.[Hours] - CTE.Dhour else 0 End as OT,
    CASE when   
    cte.OTEntitled = 'Yes'  AND cte2.[Hours] >= CTE.Dhour 
THEN (( cte2.[Hours] - 8) * 100) else 0 END AS OTAMount,  
   -- cte2.[Hours] >= 8 
     -- THEN ( cte2.[Hours] - 8) * 100 else 0 END AS OTAMount,
   
    Convert(varchar(10), cte2.INTIME,108) as [Time],
    Case When Convert(Time, cte2.INTIME,108) > cte.LTime Then 1 else 0 end as Late    
    from cte2  
    right Join cte ON cte.EmpId= cte2.EmpID
    order by cte2.Date asc

1 Ответов

Рейтинг:
9

Wendelius

Вы можете использовать, например, рекурсивный CTE для генерации желаемых дат. Рассмотрим следующий пример

CREATE TABLE Person (
  PersonId int
);

CREATE TABLE Attendance (
  PersonId int,
  InTime   datetime,
  OutTime  datetime
);

INSERT INTO Person (PersonId) VALUES 
   (1),
   (2),
   (3);

INSERT INTO Attendance (PersonId, InTime, OutTime) VALUES 
   (1, CONVERT(datetime, '2019-01-04 09:00:00.000', 120), CONVERT(datetime, '2019-01-04 12:00:00.000', 120)),
   (1, CONVERT(datetime, '2019-01-04 13:00:00.000', 120), CONVERT(datetime, '2019-01-04 17:00:00.000', 120)),
   (1, CONVERT(datetime, '2019-01-06 10:00:00.000', 120), CONVERT(datetime, '2019-01-06 17:00:00.000', 120)),
   (3, CONVERT(datetime, '2019-01-06 10:00:00.000', 120), CONVERT(datetime, '2019-01-06 11:00:00.000', 120));


;WITH Dates (ReportingDate) AS (
   SELECT CONVERT(date, '2019-01-01 00:00:00.000', 120) AS ReportingDate
   UNION ALL
   SELECT DATEADD(day, 1, d.ReportingDate)
   FROM Dates d
   WHERE d.ReportingDate < CONVERT(date, '2019-01-10 00:00:00.000', 120)
),
AttendanceHours AS (
   SELECT a.PersonId,
          CAST(a.InTime as Date) AS AttendanceDate,
		  MIN(a.InTime) AS MinIn,
		  MAX(a.OutTime) AS MaxOut
   FROM Attendance a
   GROUP BY a.PersonId,
           CAST(InTime as Date)
)
SELECT p.PersonId,
	   d.ReportingDate ,
	   ah.MinIn,
	   ah.MaxOut
FROM Person p
     CROSS APPLY Dates d
	 LEFT JOIN AttendanceHours ah ON ah.PersonId = p.PersonId AND ah.AttendanceDate = d.ReportingDate
ORDER BY p.PersonId,
	   d.ReportingDate 
OPTION (MAXRECURSION 1000);


В результате получается
PersonId   ReportingDate   MinIn                     MaxOut
--------   -------------   -----                     ------
1          2019-01-01      NULL                      NULL
1          2019-01-02      NULL                      NULL
1          2019-01-03      NULL                      NULL
1          2019-01-04      2019-01-04 09:00:00.000   2019-01-04 17:00:00.000
1          2019-01-05      NULL                      NULL
1          2019-01-06      2019-01-06 10:00:00.000   2019-01-06 17:00:00.000
1          2019-01-07      NULL                      NULL
1          2019-01-08      NULL                      NULL
1          2019-01-09      NULL                      NULL
1          2019-01-10      NULL                      NULL
2          2019-01-01      NULL                      NULL
2          2019-01-02      NULL                      NULL
2          2019-01-03      NULL                      NULL
2          2019-01-04      NULL                      NULL
2          2019-01-05      NULL                      NULL
2          2019-01-06      NULL                      NULL
2          2019-01-07      NULL                      NULL
2          2019-01-08      NULL                      NULL
2          2019-01-09      NULL                      NULL
2          2019-01-10      NULL                      NULL
3          2019-01-01      NULL                      NULL
3          2019-01-02      NULL                      NULL
3          2019-01-03      NULL                      NULL
3          2019-01-04      NULL                      NULL
3          2019-01-05      NULL                      NULL
3          2019-01-06      2019-01-06 10:00:00.000   2019-01-06 11:00:00.000
3          2019-01-07      NULL                      NULL
3          2019-01-08      NULL                      NULL
3          2019-01-09      NULL                      NULL
3          2019-01-10      NULL                      NULL


Maciej Los

По-моему, выглядит идеально!

Member 12314309

Уважаемый Венделиус, Большое Спасибо, сэр ...Самое большое уважение к тебе.....Спасибо снова

Wendelius

Пожалуйста :)

Member 13431498

очень очень очень хорошо и спасибо и еще раз спасибо