2011-11-29 57 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