2015-02-24 64 views
0

我創建了一個存儲過程將接受startdateenddatetimezoneuserhost獲取從一個表中的所有日期,從另一個表

,並會顯示每個所有記錄計數得到每個日期的總記錄在給定的日期範圍內的一天。

我已經創建了一個存儲過程對於此使用LEFT OUTER JOIN以下是我的代碼:

USE [database] 
GO 
/****** Object: StoredProcedure [dbo].[sp_getPageViewCountDayWise]   Script Date: 24/02/2015 10:25:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_getPageViewCountDayWise] 

    -- Add the parameters for the stored procedure here 
    --<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> 

    @startdate DATETIME, 
    @enddate DATETIME, 
    @timezone VARCHAR(6), 
    @user varchar(500), 
    @host VARCHAR(200) 

AS 
BEGIN 

    SET NOCOUNT ON; 

    IF NULLIF(@user, '') IS NULL 
    begin 
     set @user = @host+'/%' 
    end 
    else 
    begin 
     set @user = @host+'/'[email protected]+'/%' 
    end 

    select * from [dbo].[ExplodeDates](@startdate,@enddate) 

    select CAST(a.DateTime AS DATE) AS Date, count(*) as count 
    from [dbo].[DateRange](@startdate,@enddate) AS b 
    LEFT OUTER JOIN UserLog AS a 
    ON CAST(b.thedate AS DATE) = CAST(dbo.[ConvertDateToFromTimeZone] (a.DateTime, @timezone) AS DATE) 
    and a.Url like @user 
    group by CAST(a.DateTime AS date) 

    END 

[dbo].[DateRange]是一個用戶定義的函數將返回具有在特定日期範圍內的所有日期的表如下:

GO 
/****** Object: UserDefinedFunction [dbo].[ExplodeDates] Script Date:  24/02/2015 11:12:38 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ExplodeDates](@startdate datetime, @enddate datetime) 
returns table as 
return (
with 
N0 as (SELECT 1 as n UNION ALL SELECT 1) 
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2) 
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2) 
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2) 
,N4 as (SELECT 1 as n FROM N3 t1, N3 t2) 
,N5 as (SELECT 1 as n FROM N4 t1, N4 t2) 
,N6 as (SELECT 1 as n FROM N5 t1, N5 t2) 
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N6) 
SELECT DATEADD(day,num-1,@startdate) as thedate 
FROM nums 
WHERE num <= DATEDIFF(day,@startdate,@enddate) + 1 
); 

dbo.[ConvertDateToFromTimeZone]是其中每個日期轉換成第一個功能E中給出時區

GO 
/****** Object: UserDefinedFunction [dbo].[ConvertDateToFromTimeZone]  Script Date: 24/02/2015 11:14:03 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ConvertDateToFromTimeZone] 
(
    -- Add the parameters for the function here 
    @date DATETIMEOFFSET, 
    @offset VARCHAR(6) 
) 
RETURNS DATETIME 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Result DATETIME 

    -- Add the T-SQL statements to compute the return value here 
    SELECT @Result= SWITCHOFFSET (@date , @offset) 
    -- Return the result of the function 
    RETURN @Result 

END 

假設我希望看到的2015年2月2日之間的記錄數以每天2015年2月5日的結果應該是

Date  Count 
02/02/2015 10 
03/02/2015  2 
04/02/2015  0 
05/02/2015  3 

但我的過程是這樣的

返回的東西
Date   Count 
NULL   2 
02/02/2015  10 
03/02/2015  2 
05/02/2015  3 

我做錯了什麼?

回答

1

a.DateTime是左連接的右側,因此可以返回空值。看來你想要連接的左側,這是b.thedate。因此,您應該在查詢中選擇b.thedate而不是a.DateTime(並且最好也可以使用此組)。

+0

是的,它的工作非常感謝:) – Twix 2015-02-24 06:01:27