2012-06-06 3 views
1

Я преобразуя данные из этого унаследованного таблицы: MovTime (IdMov INT, IdPerson NVARCHAR (20), Дата1 даты и времени, Тип1 NVARCHAR (30))T-SQL я преобразование данных

IdMov  IdPerson    Date1     Type 
----------- -------------------- ----------------------- ------------------------------ 
1   David    2012-06-01 09:00:00.000 Entered 
2   David    2012-06-01 12:30:00.000 Exit 
3   David    2012-06-01 14:00:00.000 Entered 
4   David    2012-06-01 18:30:00.000 Exit 
5   Kim     2012-06-02 09:00:00.000 Entered 
6   Kim     2012-06-02 12:00:00.000 Exit 

. .. Я хочу, чтобы результат будет следующим:

IdPerson  Data  Total Time 
---------- ---------- ---------- 
David  2012-06-01 08:00:00 
Kim   2012-06-02 03:00:00 

T-SQL

declare @WK_TABLE TABLE (IdMov INT, IdPerson NVARCHAR(20), Date1 datetime, Type1 nvarchar(30)) 

Insert into @WK_TABLE values(1,'David', '2012-06-01 09:00', 'Entered') 
Insert into @WK_TABLE values(2,'David', '2012-06-01 12:30', 'Exit') 
Insert into @WK_TABLE values(3,'David', '2012-06-01 14:00', 'Entered') 
Insert into @WK_TABLE values(4,'David', '2012-06-01 18:30', 'Exit') 
Insert into @WK_TABLE values(5,'Kim', '2012-06-02 09:00', 'Entered') 
Insert into @WK_TABLE values(6,'Kim', '2012-06-02 12:00', 'Exit') 


select * from @WK_TABLE 

Может кто-нибудь мне помочь?

+1

Что happes, если у вас есть строка с введенным и без соответствующего выхода? –

ответ

1

, не предполагающие изменения никогда не может быть более 24 часов (например, продлить на следующий день), и что есть некоторые ограничения предотвращения строки без соответствующего входа/выхода:

;WITH x AS 
(
    SELECT IdPerson, Date1, Type1, rn = ROW_NUMBER() 
    OVER (PARTITION BY IdPerson ORDER BY Date1) 
    FROM @WK_TABLE 
) 
SELECT 
    x.IdPerson, [Data] = CONVERT(DATE, x.Date1), 
    [Total Time] = CONVERT(TIME(0), DATEADD(MINUTE, 
    SUM(DATEDIFF(MINUTE, x.Date1, x2.Date1)), '00:00:00')) 
FROM x INNER JOIN x AS x2 
ON x.IdPerson = x2.IdPerson 
AND x.rn = x2.rn - 1 
AND x.TYpe1 = 'Entered' AND x2.type1 = 'Exit' 
GROUP BY x.IdPerson, CONVERT(DATE, x.Date1) 
ORDER BY [Data], IdPerson; 
+0

Большое спасибо Аарон;). Работает 100% –

+0

@ Панкай, что такое спешка? Может быть, лучший ответ придет. –

+0

+1. Хороший ответ. –

Смежные вопросы