2009-11-30 34 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) 
相關問題