Я создал хранимую процедуру, которая будет принимать startdate
, enddate
, timezone
, user
и host
Получить все даты из одной таблицы и получить полные записи каждой даты из другой таблицы
и будет отображать количество всех записей по каждому день в данной датеранге.
Я создал хранимую процедуру для этого с помощью 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]
это функция, которая преобразует каждую дату в го е дается временная зона
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
предположим, что я хочу видеть количество записей между 2 февраля 2015 года по 5 февраля 2015 года в день должен быть результат
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
Что я делаю неправильно?
Да, это сработало спасибо много :) – Twix