2012-04-24 10 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

は、だから、それは '[dateWeek] BY' ORDERを尊重されていないと言っていますか?あなたはまた、国別にソートすることを意味しましたか? –

+0

@AaronBertrand彼は、すべての行が除外される原因となっている週の週の値を比較しています。 – JNK

+0

ああ、行がありません。私は正しくソートされていない行があると思った。 –

答えて

5

[DateWeek]は日付ではなく、数字(1〜53)です。

どちらか...

は、あなたの最初のCTEに 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

@ブラッド - 私は自宅でもiPhoneであってもテストできませんが、このようなものはDATEADD(WEEK、DATEDIFF(WEEK、0、[eci_date] +2)、-2) * [+ 2]は日付をオフセットするので、Sat-FriはすべてDATEDIFF()で同じ結果を返し、-2は結果を土曜日に戻します。うまくいけば。] * – MatBailie

+0

それは完全に働いた。ありがとう! – Brad

4

DATEPART(ww...)は、数値週(つまり、3週目は3)を返します。あなたの比較は直接比較できないdatetimeです。

あなたは日付の週と比較する必要があります、あなたはまた、年をチェックする必要があります。ちょうど一週間チェックするには:

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

をあなたのCTEに年を追加しても、それ以外の場合は2012年1月15日と2011年1月9日は、両方が同じ「週」に表示されますことを比較する必要があります。

関連する問題