Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server返回意外的周数_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 SQL Server返回意外的周数

Sql server 2008 SQL Server返回意外的周数,sql-server-2008,tsql,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

我有一些订单在表格中,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 server),这给了我一些其他的数据,上周的数据是51,我相信这是正确的。因此,如果人们同时关注这两个问题,就会产生疑问

有人知道或知道如何分类吗

谢谢

SELECT DatePart(WEEK,order_date) AS WeekOfYear
FROM order_table

应提供周数。

SQL将一周计算为星期日-星期六,您可以使用下面的脚本查看2011年的周数。一月一日是星期六,这意味着第一周只有一天。2011年是53周,大多数年份是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
DECLARE@dStartDate-DATETIME
设置@dStartDate='01/01/2011'
而@dstardate<'01/01/2012'
开始
打印转换(VARCHAR,@dstardate,101)
+ ' : ' 
+转换(VARCHAR,DATEPART(周,@dstardate))
+ ' : ' 
+日期名称(DW,@dstardate)
设置@dStartDate=@dStartDate+1
结束
如果要将SQL计数的日期更改为一周的第一天,可以使用DATEFIRST命令

你也是

Select * from order_table Where DatePart(Week, order_date) = 52
看看什么是第52周,而不是你认为的第52周


PS如果你从1/1开始第1周,就不可能有一年52周,除非1和或52不是七天工作周。

2011年12月20日的iso_周是51周。也许这就是你需要的

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

我觉得2012年很有趣@WilliamDwyer链接不正确。Iso_周由一年中星期四的数量决定。所以一周(星期一到星期天),其中星期四是一年中的第二个星期四,被认为是第二周。我想你有一些VB语法。应拼写为
,不带双引号,而不是
“ww”
。(是的,我知道SQL Server接受ww,但为什么不详细说明它,以便清楚它是否是工作日、工作日编号等?
w
wk
ww
都支持速记,你能背诵它们吗?我不能。看…)你不是一直在关注我吗@AaronBertrand-谢谢你的建议-我会编辑它。:-)别以为我在找你的茬儿,也别特别跟着你。我正试图阻止很多人继续使用糟糕的编码实践。@AaronBertrand我不是故意这么说的-我很感激你的建议。我刚刚在另一个线程上使用DATEADD发布了一个答案-我编辑了该线程,以符合您指出的良好做法。仅供参考:第一个iso_周的计算因地区而异(我认为标准是第一个星期四的一周),因此一年中可能有53或54周。@Ben:实际上,有了
,你可以有53或54周。使用
ISO_周
你将有52或53个星期四(因为这将是任何给定年份的星期四数)。我同意Andriy M.@ben ISO_周没有任何变化(这就是为什么它被称为ISO_周)。