我有一份报告,需要在过去十周内每周注册一次,并将其显示为
“2009年10月10日结束”500“
“2009年9月3日结束”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
之间的条款是在08/02/2009和10/10/2009之间进行的,但结果不包含10月10日那一周的任何记录,即使数据库中有数千条记录。
我猜我要么被错误的东西分组,要么就是其他东西。
非常感谢任何帮助。
答案 0 :(得分:1)
尝试DATEPART功能:
SELECT
datepart(week,createdate) as WeekNumber
, count(*) as RowsPerWeek
FROM aspnet_membership WITH (nolock)
GROUP BY datepart(week,createdate)
您可以使用min(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)
这将在本周末返回星期六(时间部分仍然可以变化。)
我从你的问题中看出你已经知道如何格式化长日期。
答案 1 :(得分:1)
你的DateAdd功能实际上是找到上一个周的星期六,即2009年10月13日它将于2009年10月7日和10/8/2009返回2009年10月13日它正在返回10/3/2009等。一个简单的+7应该修复它:
DATEADD(dd, - DATEPART(dw, CONVERT(varchar, CreateDate, 101)) + 7, CONVERT(varchar, CreateDate, 101))