Member 11323395 Ответов: 2

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


Мне нужно получить отсутствующие дни из таблицы #dates, Если дней нет в таблице журнала
любая помощь будет оценена по достоинству

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

Declatr @DateT Table(D Date);
select @d1 = '10/1/2013',@d2= '10/31/2013';
;with dates ( date )
as
(
select @d1
union all
select dateadd(d,1,date) 
from dates
where date < @d2
)
insert into @DateT
select date as CountedDays  from dates ;
 
   Select distinct ID,convert(time,Log_D),Late,EarlyOut,AbsentOne,Day(Log_D) as day1 From(SELECT  m.ID,L.Log_D,L.C,T.EnterAllow_FD,W.FirstStartTime,T.Late_FD,T.EarlyOut_FD,T.OutAllow_FD,W.FirstEndTime,a.StartDate,a.EndDate,W.id WID, 
   
   (CASE WHEN convert(time,L.Log_D)>Dateadd(mi,T.Late_FD,W.FirstStartTime) and convert(time,L.Log_D)<Dateadd(mi,T.EnterAllow_FD+T.Late_FD,W.FirstStartTime) and COUNT(*) OVER (PARTITION BY L.EmpId,day(L.Log_D)) = 2 and L.C =1  
   then 'ت'end )as Late,
   (CASE WHEN convert(time,L.Log_D)<Dateadd(mi,-T.EarlyOut_FD,W.FirstEndTime) and convert(time,L.Log_D)>Dateadd(mi,-(T.EarlyOut_FD+T.OutAllow_FD),W.FirstEndTime)and COUNT(*) OVER (PARTITION BY L.EmpId,day(L.Log_D)) = 2   and L.C =2  
   then 'خ,م'end )as EarlyOut,
  
  (CASE WHEN (COUNT(*) OVER (PARTITION BY L.EmpId,day(L.Log_D)) < 2) 
  or (convert(time,L.Log_D)>Dateadd(mi,T.EnterAllow_FD+T.Late_FD,W.FirstStartTime )
   and convert(time,L.Log_D)<Dateadd(mi,-(T.EarlyOut_FD+T.OutAllow_FD),W.FirstEndTime))  THEN 'غ'  END) as [AbsentOne]

   from WorkPeriod W,LogT L full join MinimumInfoT m on m.ID =L.EmpId   ,TimeRulesT T,WorkPeriod a2 join WorkPeriod a on  a2.id=a.PeridNo where  month(L.Log_D) =10
   and year(L.Log_D) =2013 
  
   and L.C in(1,2) 
   and L.Log_D  not Between a.StartDate and a.EndDate
   and M.ID =L.EmpId 
   and W.id =m.W_Period 
   and W.id=T.WorkPeriodID
   and W.id=a.PeridNo)  as tt,@DateT T2 order by ID,day1

2 Ответов

Рейтинг:
2

S.Dwaik

использовать этот код


SELECT  DATENAME(dw, GETDATE()) union all
SELECT  DATENAME(dw, DATEADD(dd, 1, GETDATE())) union all
SELECT  DATENAME(dw, DATEADD(dd, 2, GETDATE())) union all
SELECT  DATENAME(dw, DATEADD(dd, 3, GETDATE())) union all
SELECT  DATENAME(dw, DATEADD(dd, 4, GETDATE())) union all
SELECT  DATENAME(dw, DATEADD(dd, 5, GETDATE())) union all
SELECT  DATENAME(dw, DATEADD(dd, 6, GETDATE()))


Member 11323395

не могли бы вы объяснить, как использовать этот код с моим существующим кодом ?
потому что этот код приносит все отсутствующие дни, но не приносит дни, которых нет в таблице журнала
заранее спасибо

CHill60

Перечисление дней недели не идет ни в какое сравнение с ответом на вопрос ОП

Рейтинг:
13

CHill60

Самый простой способ сделать это-использовать соединение для фильтрации данных.

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

create table Employee (EmpId int identity(1,1), Name nvarchar(125))
insert into Employee values ('Joe Bloggs')

Create Table attendanceLog
(
	id int identity(1,1),
	EmpId int,
	DateLogged Date
)
insert into attendanceLog values
(1, '2013-10-02'),
(1, '2013-10-03'),
(1, '2013-10-04'),
(1, '2013-10-05'),
(1, '2013-10-06'),
(1, '2013-10-07'),
(1, '2013-10-08')

Затем в следующем запросе будут перечислены даты из (вашей) таблицы @DateT, которые не отображаются в (моей) таблице AttendanceLog:
select D 
from @DateT D
left outer JOIN attendanceLog AL ON AL.DateLogged=D.D
WHERE EmpId IS NULL
Примечание я использовал Date тип столбца. Вы, кажется, используете много CONVERT функции в вашем коде, поэтому вам может потребоваться изменить ON предложение
ON CAST(AL.DateLogged AS Date)=D.D