SQL Server返回意外的周数

时间:2012-03-08 16:16:57

标签: sql-server-2008 tsql

我在表格中有一些订单,2011年的最后订单日期是12月20日。

我正在使用sql命令计算给定周内的订单数量:

SELECT CONVERT(VARCHAR(3),DATENAME(week,convert(datetime,order_date,103))) AS week, 
  COUNT(1) as orders 
FROM order_table 
where DATENAME(YEAR,convert(datetime,order_date,103)) = '2011' 
GROUP BY CONVERT(VARCHAR(3),DATENAME(week,convert(datetime,order_date,103))) 
order by week asc

它返回了以下一些结果:

Week | Orders  
41   | 42  
42   | 110  
43   | 115  
...
...  
51   | 155  
52   | 15

问题在于,我提到的2011年最后一个订单日期是2011年12月20日,不能是52周,所以必须是第51周。

我有一些其他的统计数据(关闭另一个系统,而不是SQL服务器),它给了我一些其他的数据,上一周是51,我毫无疑问是正确的。如果人们都在寻找这两个问题,那么就会有疑问!

任何人都有任何想法或知道如何对此进行排序?

谢谢,

4 个答案:

答案 0 :(得分:10)

2011年12月20日的iso_week是51.所以也许这就是你所需要的。

SELECT datepart(iso_week, '2011-12-20')

答案 1 :(得分:1)

SQL计算一周作为周日至周六,您可以使用下面的脚本查看2011年的周数如何。1月1日是星期六,这意味着第一周只有1天。 2011年有53个SQL周,大多数年有53周

DECLARE @dStartDate DATETIME

SET @dStartDate = '01/01/2011'

WHILE @dStartDate < '01/01/2012'
BEGIN

PRINT   CONVERT(VARCHAR, @dStartDate, 101) 
        + ' : ' 
        + CONVERT(VARCHAR, DATEPART(WEEK, @dStartDate)) 
        + ' : ' 
        + DATENAME(DW, @dStartDate)

SET @dStartDate = @dStartDate + 1

END

如果要将SQL计数更改为本周的第一天,可以使用DATEFIRST命令

http://msdn.microsoft.com/en-us/library/ms181598.aspx

答案 2 :(得分:0)

SELECT DatePart(WEEK,order_date) AS WeekOfYear
FROM order_table

应该给你一周的编号。

答案 3 :(得分:0)

所以

Select * from order_table Where DatePart(Week, order_date) = 52

查看第52周的内容,而不是您认为的52。

PS鉴于你在1/1开始第1周,除非1和52不是7天,否则不可能有52周的年份。