2009-10-13 62 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) 

这将在周末返回周六(时间部分仍然可以有所不同。)
我从你的问题看,你已经知道如何格式化长日期。