2009-11-30 33 views
0

我现在这个SQL:帮助与SQL获得每天点击数为今天1个月前

CREATE PROCEDURE dbo.sel_Track_HitsLast30Days(
@projectID int 
) 
AS 
BEGIN 
DECLARE @FirstDay smalldatetime, @NumberOfMonths int, @priorMonth smalldatetime 
set @priorMonth = (SELECT CAST(
(
STR(YEAR(dateadd(m,-1, getDate()))) + '/' + 
STR(MONTH(dateadd(m,-1, getDate()))) + '/' + 
STR(DAY(dateadd(m,-1, getDate()))) 
) 
AS DateTime 
)) 
Select @FirstDay = @priorMonth, @NumberOfMonths = 1 
;WITH Days AS (
SELECT @FirstDay as CalendarDay 
UNION ALL 
SELECT DATEADD(d, 1, CalendarDay) as CalendarDay 
FROM Days 
WHERE DATEADD(d, 1, CalendarDay) < DATEADD(m, @NumberOfMonths, @FirstDay+1) 
) 
SELECT calendarday,foundDate.TotalbyDate,foundDate.date FROM Days 

LEFT OUTER JOIN (

SELECT 
COUNT(LEFT(visitDateTime, 11)) AS TotalbyDate,substring(convert(char(10), CONVERT(char(10), visitDateTime, 121)), 1, 11) AS date 

FROM 
    dbo.TrackingData 
WHERE 
    visitDateTime >= dateadd(d, datediff(d, 0, getdate()), -30) and projectID = @projectID 
    GROUP BY substring(convert(char(10), CONVERT(char(10), visitDateTime, 121)), 1, 11) 


) foundDate on foundDate.date = CalendarDay 

order by 
CalendarDay Desc 
END 

该工程确定,但它没有考虑到个月的第31天,我没有得到由于某种原因返回今天的日期。

+0

我相信这可以更好地优化,太;) – DDiVita 2009-11-30 23:26:03

+0

我真的想帮助,但这有点儿SQL我看着只重现金:) – JohnIdol 2009-12-01 00:03:28

+0

我也没有提及我需要显示空白旁边的日期,可能没有任何结果。 – DDiVita 2009-12-01 02:38:14

回答

0

好的,我明白了。鲁本斯给了我一个想法,所以我修改了我的SQL就像这样:

DECLARE @FirstDay  SMALLDATETIME, 
     @NumberOfMonths INT, 
     @priorMonth  SMALLDATETIME, 
     @firstDayLastMonth DateTime, 
     @daysCount int 
set @firstDayLastMonth = dateadd(m, -1,  dateadd(d, -day(getDate()) + 1, getDate())) 
set @daysCount = (select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(@firstDayLastMonth) as varchar)+'-'+cast(month(@firstDayLastMonth) as varchar)+'-01' as datetime))))) 
SET @priorMonth = (SELECT Cast((Str(Year(Dateadd(m,-1,Getdate()))) + '/' + Str(Month(Dateadd(m,-1,Getdate()))) + '/' + Str(Day(Dateadd(m,-1,Getdate())))) AS DATETIME)) 

Declare @before dateTime 
Set @before = Dateadd(d,[email protected],getdate()) 
SELECT @FirstDay = @before, 
     @NumberOfMonths = 1; 

WITH days 
    AS (SELECT @FirstDay AS calendarday 
     UNION ALL 
     SELECT Dateadd(d,1,calendarday) AS calendarday 
     FROM days 
     WHERE Dateadd(d,1,calendarday) <= Dateadd(m,@NumberOfMonths,@FirstDay)) 

SELECT Substring(Convert(CHAR(10),Convert(CHAR(10),calendarday,101)), 
              1,11) , 
     founddate.totalbydate, 
     founddate.DATE 
FROM  days 
LEFT OUTER JOIN (SELECT Count(Left(visitdatetime,11)) AS totalbydate, 
            Substring(Convert(CHAR(10),Convert(CHAR(10),visitdatetime,101)), 
              1,11) AS DATE 
          FROM  dbo.trackingdata 
          WHERE visitdatetime >= Dateadd(d,Datediff(d,0,Getdate()),-29) 
            AND projectid = 131 
          GROUP BY Substring(Convert(CHAR(10),Convert(CHAR(10),visitdatetime,101)), 
              1,11)) founddate 
      ON founddate.DATE = Substring(Convert(CHAR(10),Convert(CHAR(10),calendarday,101)), 
              1,11) 
+0

你为什么需要'Substring(Convert(CHAR(10),Convert(CHAR(10),calendarday,101)),1,11)'? – 2009-12-01 21:57:01

+0

我不想显示时间。它按日期和时间分组,而不是按日期分组。 – DDiVita 2009-12-05 22:23:53

1

试试这个(使用的AdventureWorks作为示例数据库)

DECLARE @today datetime, @NumberOfMonths int, @FirstDay smalldatetime 
SELECT @today = '2004-03-09', -- getdate(), tests only 
     @NumberOfMonths = 1, 
     @FirstDay = CAST(FLOOR(CAST(
         DATEADD(M, -1, @today) AS float)) AS datetime); 
WITH Days AS 
(
    SELECT @FirstDay AS CalendarDay UNION ALL 
    SELECT DATEADD(d, 1, CalendarDay) AS CalendarDay FROM Days 
    WHERE DATEADD(d, 1, CalendarDay) < DATEADD(m, @NumberOfMonths, @FirstDay+1) 
) 
SELECT CONVERT(varchar(10), CalendarDay, 111) as [Date], 
     COUNT(TransactionDate) as [Count] 
FROM  Days LEFT JOIN Production.TransactionHistory 
ON  TransactionDate = Days.CalendarDay 
GROUP BY CalendarDay 
ORDER BY CalendarDay 

将输出

 
Date  Count 
---------- ----------- 
2004/02/09 272 
2004/02/10 308 
2004/02/11 264 
2004/02/12 265 
2004/02/13 250 
... 

编辑:已更新,包括所有的间隔日期

+0

这似乎不能正常工作。该分组不适用于我,我应该在哪里使用@firstDayLastMonth?谢谢 – DDiVita 2009-12-01 02:36:00

+0

我想出了为什么分组不起作用。它与包含海啸时间的日期有关。 – DDiVita 2009-12-01 11:50:00

0

这里是鲁本的修改后的版本回答:

DECLARE @today    DATETIME, 
     @firstDayLastMonth DATETIME, 
     @daysCount int 

SET @today = getDate() 
SET @firstDayLastMonth = Dateadd(m,-1,Dateadd(d,-Day(@today) + 1,@today)) 
Set @daysCount = (select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(@firstDayLastMonth) as varchar)+'-'+cast(month(@firstDayLastMonth) as varchar)+'-01' as datetime))))) 

SELECT substring(convert(char(10), CONVERT(char(10), visitDateTime, 121)), 1, 11) AS [Date], Count(*) AS [Count] 
FROM  dbo.TrackingData 
WHERE visitdatetime >= Dateadd(d,[email protected],@today) 
GROUP BY substring(convert(char(10), CONVERT(char(10), visitDateTime, 121)), 1, 11) 
ORDER BY substring(convert(char(10), CONVERT(char(10), visitDateTime, 121)), 1, 11) 
相关问题