0

ドア システム データベースで SQL クエリを実行して、全員が何時に出勤するかを確認しようとしています。現時点では、ステートメントを使用しているだけです

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

結果を午前 5 時から午前 10 時の間に制限しますが、John Smith は何かを受け取ったり休憩したりするために外に出た可能性があるため、レポートには 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,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]
4

2 に答える 2

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);
于 2013-09-16T00:26:13.960 に答える
0

Grouping を使用して、dEvent_Date の MIN を取得できます。

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]
于 2013-09-16T00:02:31.707 に答える