SQL Server возвращает неожиданный номер недели - PullRequest
8 голосов
/ 08 марта 2012

У меня есть несколько заказов в таблице, и последняя дата заказа 2011 года - 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 года - 20 декабря 2011 года, которая не может быть 52-й неделей, поэтому должна быть 51-й неделей.

У меня есть некоторые другие статистические данные (от другой системы, а не от сервера SQL), которые дают мне некоторые другие цифры, и на прошлой неделе это 51, что, я не сомневаюсь, является правильным. Так что будут запросы, если люди ищут оба!

Кто-нибудь знает или знает, как это отсортировать?

Спасибо

Ответы [ 4 ]

10 голосов
/ 08 марта 2012

iso_week от 20 декабря 2011 года - 51. Возможно, это то, что вам нужно.

SELECT datepart(iso_week, '2011-12-20')
1 голос
/ 08 марта 2012

SQL Подсчитывает неделю как воскресенье-субботу. Вы можете использовать приведенный ниже сценарий, чтобы увидеть, как распределяются недели на 2011 год. 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

0 голосов
/ 08 марта 2012

Так же

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

Посмотрите, что такое 52-я неделя, а не 52.

PS Учитывая, что вы начинаете 1-ю неделю 1/1, невозможно52 недели года, если 1 и / или 52 не являются семидневными неделями.

0 голосов
/ 08 марта 2012
SELECT DatePart(WEEK,order_date) AS WeekOfYear
FROM order_table

Должен дать вам номер недели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...