2012-04-24 68 views
1

我正在使用SQL Server。當我嘗試使用datepart函數按星期排序信息時,它不返回任何值。我的表格中有選定日期範圍的值。SQL Server - 按datepart排序

我想使用的查詢是:

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]'?你是否也想按國家排序? – 2012-04-24 20:50:56

+0

@AaronBertrand他正在比較int周到日期值,這會導致所有行被過濾掉。 – JNK 2012-04-24 20:51:21

+0

啊,所以沒有行。我認爲有沒有排序正確的行。 – 2012-04-24 20:51:59

回答

5

[DateWeek]不是日期,它是一個數字(1到53)。

要麼...

移動WHERE條款你的第一個CTE。

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 2012-04-25 13:48:20

+0

@Brad - 我在家裏,在iPhone上,所以我不能測試它,但這樣的事情應該工作'DATEADD(WEEK,DATEDIFF(WEEK,0,[eci_date] +2),-2)' * ['2'偏移日期,所以Sat-Fri在DATEDIFF()中給出相同的結果,'-2'將結果偏移回星期六。希望。] * – MatBailie 2012-04-25 18:23:20

+0

它完美的工作。謝謝! – Brad 2012-04-25 19:41:11

4

你是一個整數比較的日期。

DATEPART(ww...)返回數字周(即3年爲第三週的一年)。您的比較是datetime,這是不可直接比較。

您需要比較日期的一週,並且您還應該檢查一年。要檢查只是一週:

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

您應該添加一年的CTE和比較,爲好,否則2012年1月15日和2011年1月9日都將在同一個「周」出現。