2013-09-15 2 views
0

Я пытаюсь запустить SQL-запрос в нашей базе данных дверных систем, чтобы узнать, в какое время все приходят на работу. На данный момент я имею только с помощью оператораSQL-запрос для поиска первого события дня

Where DATEPART(hh, ev.dEvent_Date) between '5' and '10' 

, чтобы ограничить результаты между 5 утра и 10 утра, но Джон Смит, возможно, вышел на улицу, чтобы получить что-то или на перерыв, так что отчет будет иметь несколько записей для person сверху один день. Есть ли способ, которым я могу получить первое событие для каждого каждый день? Мой текущий запрос ниже

Select tFirstName as FirstName 
    ,tLastName as LastName 
    ,DATENAME(dw, ev.dEvent_Date) as [Day] 
    ,CONVERT(varChar(11),ev.dEvent_Date) as [Date] 
    ,CONVERT(varchar(2) ,DatePart(hh,devent_Date))+':'+ case when len(convert(varchar(5),DatePart(n,devent_Date))) = '1' then '0'+ convert(varchar(5),DatePart(n,devent_Date))else convert(varchar(5),DatePart(n,devent_Date)) end as [Time] 

From dbo.tblevents as ev, dbo.tblEmployees as em 
Where DATEPART(hh, ev.dEvent_Date) between '5' and '10' 

AND ev.dEvent_Date between DATEADD(dd, -(DATEPART(dw, DATEADD(ww, -1, getdate()))-1), DATEADD(ww, -1, getdate())) and DATEADD(dd, 7-(DATEPART(dw, DATEADD(ww, -1, getdate()))), DATEADD(ww, -1, getdate())) 
And em.iEmployeeNum = ev.iUserNum 
AND tByte6 = 11 
AND tByte8 = 22 
Order by LastName, [Date] 
+1

Я не понимаю, почему вы не можете просто используйте 'MIN (время)' и агрегируйте по 'DAY'? – Kermit

ответ

0

Вы можете использовать группирование и получить МИН dEvent_Date:

Select tFirstName as FirstName 
,tLastName as LastName 
,DATENAME(dw, MIN(ev.dEvent_Date)) as [Day] 
,CONVERT(varChar(11), MIN(ev.dEvent_Date)) as [Date] 
,CONVERT(varchar(2) ,DatePart(hh, MIN(devent_Date)))+':'+ case when len(convert(varchar(5),DatePart(n, MIN(devent_Date)))) = '1' then '0'+ convert(varchar(5),DatePart(n, MIN(devent_Date)))else convert(varchar(5),DatePart(n, MIN(devent_Date))) end as [Time] 

From dbo.tblevents as ev, dbo.tblEmployees as em 
Where DATEPART(hh, ev.dEvent_Date) between '5' and '10' 
AND ev.dEvent_Date between DATEADD(dd, -(DATEPART(dw, DATEADD(ww, -1, getdate()))-1), DATEADD(ww, -1, getdate())) 
AND DATEADD(dd, 7-(DATEPART(dw, DATEADD(ww, -1, getdate()))), DATEADD(ww, -1, getdate())) 
AND em.iEmployeeNum = ev.iUserNum 
AND tByte6 = 11 
AND tByte8 = 22 
GROUP BY tFirstName, tLastName 
Order by LastName, [Date] 
1

Вы можете сделать это на все дни. И упростить ваш запрос немного:

Select tFirstName as FirstName, tLastName as LastName, DATENAME(dw, ev.dEvent_Date) as [Day] 
     CONVERT(varChar(11), ev.dEvent_Date) as [Date], 
     (CONVERT(varchar(2) , DatePart(hh, min(devent_Date)))+':'+ 
     case when len(convert(varchar(5), DatePart(n, min(devent_Date)))) = '1' 
      then '0'+ convert(varchar(5), DatePart(n, min(devent_Date))) 
      else convert(varchar(5), DatePart(n, min(devent_Date))) 
     end 
     ) as [Time] 
From dbo.tblevents ev join 
    dbo.tblEmployees em 
    on em.iEmployeeNum = ev.iUserNum 
Where ev.dEvent_Date between DATEADD(dd, -(DATEPART(dw, DATEADD(ww, -1, getdate()))-1), DATEADD(ww, -1, getdate())) and 
          DATEADD(dd, 7-(DATEPART(dw, DATEADD(ww, -1, getdate()))), DATEADD(ww, -1, getdate())) And 
tByte6 = 11 and tByte8 = 22 
group by tFirstName, tLastName, cast(dv.dEvent_Date as date), DATENAME(dw, ev.dEvent_Date) 
Order by LastName, [Date]; 

Чтобы быть честным, будет использовать следующий, чтобы получить дату и время, отформатированный в виде одной колонки:

convert(varchar(16), min(ev.dEvent_date), 121); 
Смежные вопросы