2012-04-24 4 views
1

Я использую SQL Server. Когда я пытаюсь сортировать информацию по неделям, используя функцию datepart, она не возвращает никаких значений. В моей таблице есть значения для выбранного диапазона дат.SQL Server - Сортировка по дням недели

Запрос Я пытаюсь использовать это:

Declare @StartDate datetime, @EndDate datetime 
set @StartDate = '20120401 00:00:00' 
set @EndDate = '20120430 23:59:59' 
;WITH 
mytablePlusHours As 
(
SELECT *, 
    DATEPART(ww, [eci_date])  AS [dateWeek] 
FROM [mytable]  
) 
, mytableHourGroups As 
(
SELECT dateWeek, 
     [eci_country], 
     COUNT(*)  As [Number_Country], 
     ROW_NUMBER() OVER(PARTITION BY dateWeek ORDER BY [eci_country]) 
         As [Country_Rank] 
FROM  mytablePlusHours 
GROUP BY dateWeek, [eci_country] 
) 
SELECT 
    dateWeek  AS [eci_date], 
    [eci_country], 
    [Number_Country] 
FROM mytableHourGroups WITH(NOLOCK) 
WHERE [dateWeek] between @StartDate and @EndDate 
ORDER BY [dateWeek], [Number_Country] DESC 

Я могу вытащить информацию дня, но я не могу понять, как сортировать его по неделям. Может кто-нибудь, пожалуйста, сообщите мне, где мой код неправильный? Благодаря!

Я пытаюсь показать мои данные, как:

Week Country  Count 
16 United States 13 
17 Canada   41 
+0

Так вы говорите, это не чествование 'ORDER BY [dateWeek]'? Вы имели в виду также сортировать по странам? –

+0

@AaronBertrand сравнивает значения int week to date, что приводит к отфильтровыванию всех строк. – JNK

+0

А, так нет НИКАКОЙ строк. Я думал, что есть строки, которые не были отсортированы правильно. –

ответ

5

[DateWeek] не является датой, это число (от 1 до 53).

Либо ...

Переместить пункт WHERE к вашему первому КТР.

mytablePlusHours As 
(
    SELECT *, DATEPART(ww, [eci_date])  AS [dateWeek] 
    FROM [mytable] 
    WHERE [eci_date] between @StartDate and @EndDate 
) 

Или измените DATEPART() на функцию, которая возвращает дату ...

mytablePlusHours As 
(
    SELECT *, DATEADD(WEEK, DATEDIFF(WEEK, 0, [eci_date]), 0) AS [dateWeek] 
    FROM [mytable] 
) 
+0

Как я начну неделю в субботу, а не в понедельник? – Brad

+0

@Brad - Я дома и на iPhone, поэтому я не могу его протестировать, но что-то вроде этого должно работать 'DATEADD (WEEK, DATEDIFF (WEEK, 0, [eci_date] +2), -2)' * ['+ 2' смещает дату, так что Sat-Fri дает одинаковый результат в DATEDIFF(), а' -2' смещает результат обратно в субботу. Надеюсь.] * – MatBailie

+0

Он отлично работал. Благодаря! – Brad

4

вы сравниваете целое с датой.

DATEPART(ww...) возвращает цифровую неделю (т. Е. 3 на третью неделю года). Ваши сравнения - datetime, которые напрямую не сопоставимы.

Вам нужно сравнить с неделей дат, и вы также должны проверить год. Чтобы проверить, как раз за неделю:

WHERE [dateWeek] between DATEPART(ww,@StartDate) and DATEPART(ww,@EndDate) 

Вы должны добавить год к вашему КТР и сравнить, что хорошо, в противном случае 1/15/2012 и 1/9/2011 оба появляются в одной и той же «неделю».

Смежные вопросы