2010-03-16 116 views
4

使用MS SQL Server。我制作了一个名为SP_Get_CallsLogged的存储过程。每日/每周/每月记录数通过StoredProcedure搜索

我有一个名为TRN_Call的表,它有一列名为CallTime这是一个DateTime。

我在我的应用程序中的网页用户在其中输入: -

  1. 起始日期(DATETIME)

  2. 结束日期(DATETIME)

  3. (每日/每周/每月)(varchar)(来自DropDownList)

我想要得到的记录这些通话的在我的表TRN_Call用户在DropDownList选择的指定时间内(每日/每周/每月)的基础上。

例如

StartDate ='1/18/2010 11:10:46 AM' 
EndDate ='1/25/2010 01:10:46 AM' 
Period =Daily 

所以提到的日期,上述这些的记录计数(起始日期+结束日期)应该进来的方式,这样我可以指那些数分别即如下: -

Date 1/18/2010 Records Found 5 
Date 1/19/2010 Records Found 50 
Date 1/20/2010 Records Found 15 
Date 1/21/2010 Records Found 32 
Date 1/22/2010 Records Found 12 
Date 1/23/2010 Records Found 15 
Date 1/24/2010 Records Found 17 
Date 1/25/2010 Records Found 32 

,并把这些计数到Web应用程序,以便这些计数可以在Crystal Reports中列出。

+2

你不应该调用存储过程'sp_xxxxxx'作为以sp_是一个保留期限,并表示到服务器,检查所有的内置的SP预先。 – cjk 2010-03-16 08:50:45

+0

@Peter Lang:感谢您的建议。 – 2012-03-10 23:50:39

回答

2

我会编辑您的存储过程通过在网页中选择的开始日期和结束日期,以便您可以包括他们WHERE子句。

-- Daily 
SELECT CallTime, COUNT(*) AS 'Records Found' 
FROM TRN_Call 
WHERE CallTime BETWEEN @StartDate AND @EndDate 
GROUP BY CallTime 

每周可能相当复杂。

如果选中此link你会看到一个功能(如下图),你可以用它来帮助你获得每周结果

例如因此,创建以下功能

create function FiscalWeek (@startMonth varchar(2), @myDate datetime) 
returns int 
as 
begin 
declare @firstWeek datetime 
declare @weekNum int 
declare @year int 
set @year = datepart(year, @myDate)+1 
--Get 4th day of month of next year, this will always be in week 1 
set @firstWeek = convert(datetime, str(@year)[email protected]+'04', 102) 
--Retreat to beginning of week 
set @firstWeek = dateadd(day, (1-datepart(dw, @firstWeek)), @firstWeek) 
while @myDate < @firstWeek --Repeat the above steps but for previous year 
begin 
    set @year = @year - 1 
    set @firstWeek = convert(datetime, str(@year)[email protected]+'04', 102) 
    set @firstWeek = dateadd(day, (1-datepart(dw, @firstWeek)), @firstWeek) 
end 
set @weekNum = (@year*100)+((datediff(day, @firstweek, @myDate)/7)+1) 
return @weekNum 
end 

现在,您应该能够运行下面的代码,应该按几周进行分组。如果您希望每天,每周或年之间选择,你也将不得不通过用户所选的时间以您的存储过程。

(PS。还没有得到全面执行年至今)

SELECT dbo.FiscalWeek('04', CallTime), dbo.FiscalWeek('04', CallTime)%100 , COUNT(*) AS 'Records Found - Weekly' 
FROM TRN_Call 
WHERE CallTime BETWEEN @StartDate AND @EndDate 
GROUP BY dbo.FiscalWeek('04', CallTime), dbo.FiscalWeek('04', CallTime)%100 
+0

这不起作用,或回答问题(根据所选的周期长度组,如每天,每周,每月) – cjk 2010-03-16 08:51:51

+0

@ck:您的宝贵提示谢谢....... @KevChadders:非常感谢KevChadders,在您的帮助下,我能够获得每周结果。 但需要有关每日和每月问题的帮助。 其余的人,请在这方面帮助我。 – 2010-03-16 13:29:49

+0

@KevChadders:我为每个每日,每周和每月制作了三个独立的函数。然后根据用户选择的下拉菜单调用这三个函数中的一个。所以我的问题是通过上述逻辑解决的。再次感谢很多KevChadders! – 2012-03-10 23:58:51