2015-12-16 5 views
1

У меня есть вопрос, связанный с хранимой процедурой, которую я пытаюсь создать.SQL Datediff Хранимая процедура

У меня есть таблица с партиями транзакций. Текущая структура таблицы ниже. Я пытаюсь написать автоматический тест нагрузки, где разница между статусом загрузки и статусом загрузки составляет менее 30 минут.

Если разница составляет> 30, она вернет ошибку в таблице, созданной хранимой процедурой. Я пытаюсь запустить это с помощью переменных, поскольку эта хранимая процедура будет вызвана некоторым кодом на Python, который загружает транзакции. Будет около 100 идентификаторов партий, поэтому около 200 строк данных хранится в хранимой процедуре.

Я пытаюсь выяснить, является ли цикл лучшим выбором, оператором if или обоими. Любая помощь приветствуется.

AuditID BatchID BatchStatus TimeOccurred 
1  TEST_01 Loading  2007-05-10 01:30:00 
2  TEST_01 Loaded   2007-05-10 01:59:00 
3  TEST_02 Loading  2007-05-10 01:30:00 
4  TEST_02 Loaded   2007-05-10 02:00:00 
5  TEST_03 Loading  2007-05-10 01:30:00 
6  TEST_03 Loaded   2007-05-10 02:05:00 
+0

, какую базу данных вы используете –

+0

я создал свою собственную базу данных для этого, но у меня есть AdventureWorks на моем ПК. – AndrewC10

+1

Я спрашивал о RDBMS, которую вы используете. Я считаю, что вы используете 'Sql Server'. Также вы можете объяснить эту часть *, она вернет ошибку в таблице, созданной SProc * –

ответ

2

Учитывая, что BatchID будет иметь один Loading время и один Loaded время

попробовать что-то вроде этого

with cte as 
(
select BatchID, 
     max(case when BatchStatus ='Loading' then TimeOccurred END) Loading, -- Min(TimeOccurred) 
     max(case when BatchStatus ='Loaded' then TimeOccurred END) Loaded -- Max(TimeOccurred) 
from yourtable 
group by BatchID 
),diff as 
(
select BatchID, 
     datediff(minutes,Loading,Loaded) as Loading_time, 
     case when datediff(minutes,Loading,Loaded) > 30 then 'Fail' else 'Pass' End as pass_fail 
from cte 
+0

Это сработало отлично, спасибо @ VR46! Я рассмотрю все заявления, которые вы использовали. Я предполагал, что это намного проще, чем это, но я был неправ. Я планирую сохранить это как хранимую процедуру, и я предполагаю, что эти данные будут оттеснены дальше, когда я снова запускаю sproc? Благодаря! – AndrewC10

+0

Я предлагаю вам использовать этот запрос select, а не sproc. –

0
declare @Data table (AuditID int, BatchID varchar(100), BatchStatus varchar(100), TimeOccured datetime) 
insert into @Data (AuditID, BatchID, BatchStatus, TimeOccured) values (1, 'TEST_01', 'Loading', cast('2007-05-10 01:30:00' as datetime)) 
insert into @Data (AuditID, BatchID, BatchStatus, TimeOccured) values (1, 'TEST_01', 'Loaded', cast('2007-05-10 01:59:00' as datetime)) 
insert into @Data (AuditID, BatchID, BatchStatus, TimeOccured) values (1, 'TEST_02', 'Loading', cast('2007-05-10 02:00:00' as datetime)) 
insert into @Data (AuditID, BatchID, BatchStatus, TimeOccured) values (1, 'TEST_02', 'Loaded', cast('2007-05-10 02:35:00' as datetime)) 

declare @Results table (BatchID varchar(100), DurationMins int, Success bit) 

-- Process each BatchID separately, store results in Results table 
declare @BatchID as varchar(100) 
Declare @StartTime as datetime 
Declare @StopTime as datetime 
Declare @MinDiff as int 
declare c cursor for 
    select distinct BatchID from @Data 
open c 
fetch next from c into @BatchID 
while @@fetch_status = 0 
begin 
    select @StartTime = TimeOccured from @data where BatchID = @BatchID and batchStatus = 'Loading' 
    select @StopTime = TimeOccured from @data where BatchID = @BatchID and batchStatus = 'Loaded' 
    select @MinDiff = datediff(minute,@StartTime,@StopTime) 
    Insert into @Results (BatchID, DurationMins, Success) 
    select @BatchID, @MinDiff, case when @MinDiff > 30 then 0 else 1 end 
    fetch next from c into @BatchID 
end 
close c 
deallocate c 
select * from @Results 
Смежные вопросы