2009-10-13 69 views
1

末我有需要總量可達每週註冊的數量,在過去的十年星期,顯示爲(SQL)分組由

「周結束二零零九年十月十日」的報告500"

「周結束10月3日,2009年」 400"

「週刊2009年結束9月26日,」 1000"

等等

這裏是我的查詢:

SELECT Count(*) as [Total] 
     ,Week = DateAdd(day, -1 * datepart(dw, CONVERT(varchar,CreateDate,101)), CONVERT(varchar,CreateDate,101)) 

FROM aspnet_membership WITH (nolock) 

WHERE CreateDate BETWEEN CAST(CONVERT(varchar, DATEADD(ww, -10, DATEADD(dd, -(DATEPART(dw, GETDATE()) - 1), GETDATE())), 101) AS DATETIME) AND 
       DateAdd(day, -1 * datepart(dw, CONVERT(varchar,Getdate(),101)), CONVERT(varchar,GetDate(),101)) 
GROUP BY DateAdd(day, -1 * datepart(dw, CONVERT(varchar,CreateDate,101)), CONVERT(varchar,CreateDate,101)) 
ORDER BY [Week] DESC 

子句之間2009年8月2日和10/10/2009之間做了,但結果不包含任何記錄,10月10日當週,甚至儘管數據庫中有數千個。

我在猜測我是由不正確的東西組成的東西。

任何幫助將不勝感激。

回答

1

你的DateAdd函數實際上是找到之前的周的週六,也就是2009年10月13日它將返回10/10/2009,對於10/7/2009和10/8/2009,它將返回10/3/2009等。一個簡單的+7應該修復它:

DATEADD(dd, - DATEPART(dw, CONVERT(varchar, CreateDate, 101)) + 7, CONVERT(varchar, CreateDate, 101)) 
+0

公式工作,但想知道爲什麼你CONVERT CreateDate到一個varchar字段?它似乎沒有CONVERT工作正常。 – Andomar 2009-10-13 23:28:10

+1

我剛剛複製了JackM的公式 - 我認爲他有一些理由來進行轉換。 – Martha 2009-10-14 14:10:18

1

嘗試DATEPART功能:

SELECT 
    datepart(week,createdate) as WeekNumber 
, count(*) as RowsPerWeek 
FROM aspnet_membership WITH (nolock) 
GROUP BY datepart(week,createdate) 

可以使用分鐘(CREATEDATE)計算本週結束。與max(createdate)或甚至avg(createdate)一樣好。

SELECT 
    DATEADD(dd, 7-(DATEPART(dw, min(createdate))), min(createdate)) 
     as EndOfWeek 
, count(*) as RowsPerWeek 
FROM aspnet_membership WITH (nolock) 
GROUP BY datepart(week,createdate) 

這將在週末返回週六(時間部分仍然可以有所不同。)
我從你的問題看,你已經知道如何格式化長日期。