2011-11-29 58 views
0

我正在參加考勤管理系統。如何用SQL查詢這些數據?

我的表中的數據是這樣的:

LogId  EmployeeId  LogTime       Date 
31   22    09:44:00 AM     2011-11-04 00:00:00.000 
40   22    01:51:00 PM     2011-11-04 00:00:00.000 
43   22    02:14:00 PM     2011-11-04 00:00:00.000 
45   22    07:36:00 PM     2011-11-04 00:00:00.000 

我想顯示第一LOGTIME(上午9時44分00秒)作爲銀泰,二LOGTIME(下午1時51分零零秒)作爲OutTime,第三LOGTIME (02:14:00 PM)作爲InTime等..然後我想要一個特定日子的所有INOut時間的總結。

+1

只是一個側面說明。我會結合時間和日期列以避免午夜錯誤。 –

+2

我很確定我昨天看到了同樣的問題... –

+0

@AdamWenger:呵呵 - 一個似曾相識,呃?我認爲我們有一個關於SO的人,他問我:「我如何......與InTime/OutTime」已經廣告噁心......不知道這是一個stadard考試還是其他人都會碰到的...... –

回答

0
SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeId ORDER BY LogId) % 2 AS InTime, 
     * FROM TimeStampTable 

這給了你InTime = 1時間1,3,5 ...每個EmployeeIdInTime = 0爲休息。

0

我的解決辦法:

select *, Case (ROW_NUMBER() over (ORDER BY LogId)) % 2 
When 1 Then 'In Time' Else 'Out Time' End as 'Row' from @Table 

希望這是你究竟需要。

select CASE(N.Row) 
When 1 then N.LogTime Else null End as InTime, 
CASE(N.Row) When 0 then N.LogTime Else null End as OutTime, N.* from 
(select ROW_NUMBER() over (ORDER BY LogId) % 2 as 'Row',* from @Table) N 
+0

但我需要顯示單列不在一列中的銀泰和Outtime。 – Janki

+1

select CASE(N.Row)When 1 then N.LogTime Else null End as InTime, CASE(N.Row)When 0 then N.LogTime Else null End as OutTime,* from( select ROW_NUMBER( )over(ORDER BY LogId)%2 as'Row',* from @Table )N –

-1

我試圖通過將問題分爲更小的問題 在SQL Server中提供COALESCE函數來做到這一點可用於我已經創建了字段的表名爲定時(LOGID,僱員,LOGTIME,日期)

衝記錄可以使用下面的查詢

declare @Punch nvarchar(100) 
set @punch='' 

select @punch=Coalesce(cast(datepart(HH,logtime)as nvarchar)+':'+cast(datepart(MI,logtime)as nvarchar)+(case (row_number() over (order by logid))%2 when 0 then ' Out' else ' In' end)+','[email protected],@punch) from timing order by logid desc 

select @punch as punches 

和持續時間,你可以使用類似this--

收集
declare @duration int 
set @duration=0 
SELECT 
    @duration = coalesce((case row_number() over (order by t1.logid) %2 
    when 1 
    then cast(datediff(mi,t1.logtime,isnull(t2.logtime,t1.logtime))as int) else 0 end)[email protected],@duration) 
FROM 
    timing AS t1 
LEFT JOIN 
    timing AS t2 
     ON t2.logid = (SELECT MIN(logid) FROM timing WHERE logid > t1.logid) 
select @duration