2011-12-29 4 views
1

Здесь я получаю «ProcessTime» в часах и минутах, а в случае секунд только проверить на противоположное состояние (см код ниже)Как улучшить этот запрос будет

Есть ли способ улучшить это?

select convert(varchar(10),ScanDate,101) as [Date], tmb.WO, tc.WOCategory, count(IdSingle) QtyProd, tb.Brand, tm.Model, 
     (case when (DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))/60%24 > 0) then 
      convert(varchar(5), DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))/60%24) + 'h '    
       else 
      '' 
     end) + 
     (case when (DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))%60 > 0) then 
      convert(varchar(5), DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))%60) + 'm'    
       else 
      '' 
     end) +   
     (case when 
      (DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))/60%24 <= 0) and 
      (DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8)))%60 <= 0) then 
      '< 1 min' 
      else 
      '' 
     end) ProcessTime 
+0

Какой версии SQL вы используете? – Hogan

+0

извините за поздний сервер sql 2005 – Somebody

ответ

1

С SQL Server 2005 вы можете использовать CTE для улучшения этого запроса.
Что-то вроде этого:

;WITH minmax AS 
(
    SELECT someKey, 
      DateDiff(mi, Min(convert(varchar(10),ScanDate,8)), Max(convert(varchar(10),ScanDate,8))) as mdiff 
    FROM tablename 
    GROUP BY fieldName 
) 
Select convert(varchar(10),ScanDate,101) as [Date], tmb.WO, tc.WOCategory, count(IdSingle) QtyProd, tb.Brand, tm.Model, 
     (case when (mdiff/60%24 > 0) then 
      convert(varchar(5), mdiff/60%24) + 'h '    
       else 
      '' 
     end) + 
     (case when (mdiff%60 > 0) then 
      convert(varchar(5), mdiff%60) + 'm'    
       else 
      '' 
     end) +   
     (case when 
      (DateDiff(mi, mdiff/60%24 <= 0) and (DateDiff(mi, mdiff%60 <= 0) then 
      '< 1 min' 
      else 
      '' 
     end) ProcessTime 
from tablename 
join minmax on tablename.somekey = minmax.somekey 
+0

humm ... интересный, спасибо. – Somebody

+0

Я думаю, что есть еще один способ улучшить, но я должен пойти на встречу ... – Hogan

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