sql - 如何在记录的时间间隔中添加非记录的时间间隔?如何创建 tihs 方法?

标签 sql sql-server sql-server-2005

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],      
        dbo.fn_GetActivityLogArranger2(Date,@type) as [Time]
        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') 我的结果表


表2

访问计数------------时间--------------
23------------10:30------------
33---------------------11:00----------------
43---------------------11:30----------------
53---------------------12:00----------------

但; 12:30-13:30:午休。所以,没有人会想进入系统。所以我的表结果:

表2

访问计数-----------时间-----------
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'....” 我需要发电机:'12:30...22:30...24:30'- --<0,0,0,0..... 和联盟(这是我的猜测)

最佳答案

创建一个所有时间表(您可以使用数字表并使用 dateadd(mm, value*30) 但时间可能更容易)您需要在报告中覆盖并加入查询中的时间以用作时间值(value);这会让你填补你的空白。

创建一个时间表(在下面的示例中为 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     

关于sql - 如何在记录的时间间隔中添加非记录的时间间隔?如何创建 tihs 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835251/

相关文章:

c# - 就性能而言,C# 的 ToUpper 或 SQL 中的 Upper 函数哪个更好

java - 如果当前数据库不可用,C3PO可以连接到另一个url吗?

sql - 如何在 SQL Server 2005 表的 NTEXT 字段中查找 Unicode/非 ASCII 字符?

SQL更新查询在where子句中使用聚合函数和group by?

sql - 如何在 rowguid 列中输入值?

php - 有没有办法在 SQL 查询中执行条件逻辑?

php - 带有 join 子句和 group by 子句的 mysql 查询

c# - 如何对同时包含字符串和数值的 varchar 类型列进行排序

sql-server - 在不对数据库名称进行硬编码的情况下从 T-SQL 存储过程引用另一个数据库

sql-server-2005 - sql server 2005 32 位在 win 2003 64 位上仅使用 2 GB