Как вычесть две записи данных в SQL Server - PullRequest
0 голосов
/ 14 апреля 2011

В моей базе данных есть одна таблица, содержащая (ID, Имя, Время, Тип)

ID     Name    Time        Type
1      Osama   12:15 AM    IN
2      Osama   12:20 AM    OUT
3      Osama   14:15 AM    IN
4      Osama   14:20 AM    OUT

Мне нужно создать запрос для вывода разницы во времени (OUT-IN)

Name, OUT-IN

Пример:

Osama, 5
Osama, 5

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

CTE TestData здесь исключительно для целей тестирования. Также отмечу, что произошла ошибка ваших данных. Последнее, что я проверил 14:15 AM, не является допустимым временем. Это либо 14:15 (через 24-часовые часы), либо 2:15 AM (через 12-часовые часы). Кроме того, для этого решения потребуется SQL Server 2005 или более поздняя версия.

With TestData As
    (
    Select 1 As Id, 'Osama' As Name, '12:15' As Time, 'IN' As Type
    Union All Select 2, 'Osama', '12:20', 'OUT'
    Union All Select 3, 'Osama', '14:15', 'IN'
    Union All Select 4, 'Osama', '14:20', 'OUT'
    )
    , CheckInCheckOut As
    (
    Select Id, Name, Time, Type
        , Row_Number() Over ( Partition By Name, Type Order By Time ) As Num
    From TestData
    )
Select C1.Name
    , DateDiff( mi, CAST(C1.Time as datetime), Cast(C2.Time As datetime) ) As [OUT-IN]
From CheckInCheckOut As C1
    Join CheckInCheckOut As C2
        On C2.Name = C1.Name
            And C2.Type = 'OUT'
            And C2.Num = C1.Num 
Where C1.Type = 'IN'    
0 голосов
/ 14 апреля 2011

Вы можете сделать Макс (TimeRecorded), если вы согласны с предположением, что ваше время является последовательным. Это предполагает, что ваши идентификаторы являются последовательными. Вы можете управлять любым из них с проверочными ограничениями.

declare @test table (
    Id int, Name varchar(50), TimeRecorded time, TypeOfTimeRecording varchar(3)
)

insert into @test values (1, 'Osama', CONVERT(time, '12:15'), 'IN')
insert into @test values (2, 'Osama', CONVERT(time, '12:20'), 'OUT')
insert into @test values (3, 'Osama', CONVERT(time, '12:25'), 'IN')
insert into @test values (4, 'Osama', CONVERT(time, '12:30'), 'OUT')

 select testOut.Name
        ,testOut.TimeRecorded
        ,testIn.TimeRecorded
        ,DATEDIFF(minute, testIn.TimeRecorded, testOut.TimeRecorded) as [Out - In]
   from @test testOut
            inner join
        @test testIn    on testIn.Id = (select MAX(Id) from @test where Name = testOut.Name and Id < testOut.Id and TypeOfTimeRecording = 'IN')
  where testOut.TypeOfTimeRecording = 'OUT'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...