Как добавить незаписанный временной габ в записанный интервал времени? Как создать метод? - PullRequest
0 голосов
/ 07 мая 2009
CREATE procedure sp_ActivityFrequencyOneUserGraph          
(          
@date1 nvarchar(100) ,                   
@date2 nvarchar(100),        
@customerID int,        
@user int,    
@type nvarchar(50)            
)          
as          

select Count(Page) as VisitingCount,[Time]      
from      
( SELECT Page,Date,[user],      
        <strong>dbo.fn_GetActivityLogArranger2(Date,@type) as [Time]</strong>
        FROM scr_SecuristLog      
) scr_SecuristLog      
where      
        Date between @date1 and @date2      
and      
        [user] in      
(       select USERNAME      
        from scr_CustomerAuthorities      
        where customerID=Convert(varchar,@customerID)      
        and ID=Convert(varchar,@user)      
)      
group by [Time] order by [Time] asc     

return



Моя функция:



CREATE FUNCTION [dbo].[fn_GetActivityLogArranger2]    
(    
@t  AS datetime,  
@type AS nvarchar(50)    
)    

RETURNS  nvarchar(max)    
AS    
BEGIN    
declare @Return nvarchar(max)  

set @t = cast (@t as smalldatetime)  

if(@type='hour')  
begin  
set @t= dateadd(minute, -(datepart(minute, @t)), @t)  
end  

else if(@type='halfhour')  
begin  
set @t=  
    case  
        when datepart(minute, @t) >= 30  
            then dateadd(minute, 60-(datepart(minute, @t)), @t)  
        else dateadd(minute, 30-(datepart(minute, @t)), @t)  
    end  
end  
else if(@type='tenminutes')  
begin  

set @t= case   
   when datepart(minute,@t)%10 >=5  
   then dateadd(minute,10-(datepart(minute,@t)%10),@t)  
      else dateadd(minute,-(datepart(minute,@t)%10),@t)  
    end  
end  
select @Return=CONVERT(VARCHAR(5),@t, 108)    

Return @Return    
end 



если я использую dbo.fn_GetActivityLogArranger2 ('2009-04-30', 'hour') Моя таблица результатов


Table2

VisitingCount ---------- Время --------------
23 --------------------- 10:30 -------------
33 --------------------- 11:00 ----------------
43 --------------------- 11:30 ----------------
53 --------------------- 12:00 ----------------


Но; 12: 30-13: 30: перерыв на обед. Итак, никто не захочет войти в систему. Итак, результат моей таблицы:


Table2

VisitingCount ---------- Время -----------
23 --------------------- 10:30 ----------
33 --------------------- 11:00 ----------
43 --------------------- 11:30 ----------
53 --------------------- 12:00 ----------
0 ---------------------- 12:30 ----------
0 ---------------------- 13:00 ----------
0 ---------------------- 13:30 ----------
23 --------------------- 14:00 ----------
33 --------------------- 14:30 ----------
37 --------------------- 15:00 ----------

Но между этими часами ('12: 30-13: 00-13: 30') в системе не было записей. Как преобразовать Table1 в Table2? Я думаю, что мне нужна функция, чтобы генерировать все промежутки времени каждую минуту, и позже я могу использовать метод Union. Но как?

Но мне нужен динамический метод, а не текстовое значение "когда время между '12: 30' и '13: 30' ...." Мне нужен Genarator: '12: 30 ... 22:30 ... 24: 30 '--- <0,0,0,0 ..... и союз (это мое предположение) </p>

1 Ответ

1 голос
/ 08 мая 2009

Создайте таблицу на все времена (вы можете использовать таблицу чисел и использовать dateadd (мм, значение * 30), но времена, вероятно, проще), которую вы должны включить в свой отчет и присоединиться к нему в своем запросе в качестве значения времени; это позволит вам заполнить свои поля.

Создайте таблицу Times (tblTimes в приведенном ниже примере) и вставьте в таблицу все значения временного диапазона, о котором вы хотите сообщить. Затем измените свой sql, чтобы выбрать из этой таблицы и присоединиться к вашей таблице scr_SecuristLog. Делая это таким образом, вы получите только значения, которые отображаются между двумя таблицами; поэтому, если ваша таблица scr_SecuristLog работает по какой-то причине 10.36, а это не в вашей таблице tblTimes, вы не увидите эту запись.

select Count(Page) as VisitingCount,[Time]      
from   
tblTimes Alltimes
left outer join   
( SELECT Page,Date,[user],      
        dbo.fn_GetActivityLogArranger2(Date,@type) as [Time]
        FROM scr_SecuristLog      
) scr_SecuristLog      
on Alltimes.Time = scr_SecuristLog.[Time]
where      
        Date between @date1 and @date2      
and      
        [user] in      
(       select USERNAME      
        from scr_CustomerAuthorities      
        where customerID=Convert(varchar,@customerID)      
        and ID=Convert(varchar,@user)      
)      
group by [Time] order by [Time] asc     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...