2012-02-24 14 views
3

によって週でグループデータに構文SQL Serverの:1週間オフでグループ1日

dateadd(week, datediff(week, 0, CURRENT_TIMESTAMP),0) 

を使用するには、週の最後の日には、次の週に入れますように思われます。

簡単な例では

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),0) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),0) 

それはreturしかし、私は私が

を推測DATEFIRST設定によって

Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 

または

Jan 22 2012 12:00AM 
Jan 22 2012 12:00AM 
Jan 29 2012 12:00AM 
Jan 29 2012 12:00AM 
Jan 29 2012 12:00AM 

を返すことを期待しますNS

Jan 23 2012 12:00AM 
Jan 23 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 
Jan 30 2012 12:00AM 

すなわち、1月29日、予想通り1月30日ない1月23日または1月30日の週です。

私は明らかに何かが不足していますが、それが何であるかは考えられません。

+0

が、私が「DATEFIRST設定」をよく読んで、すでにあなたのを見て、それ自体 –

+0

と矛盾するように見えることにかかわらず、ポイントがあり、確かに「週の初日」を知っていたので、コメントを削除しました。 –

答えて

4

これは正しいです。

どんなに、今と1月1日1900 @@DATEFIRST変更は、それは両方の「開始」と「終了」週に影響を与えたよう間、常に全体の週の同じ番号が存在しているもの@@DATEFIRST。 1900年1月1日が月曜日である:それはあなたがDATEADDベースに

例を選択することで、それを強制することができます。@@ DATEFIRST

を無視するため

DATEADDは、わずか7日間の期間を追加します。

あなたは日曜ですか?その後、1899年12月31日までのベース

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),-1) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),-1) 

火曜日が欲しいですか?その後、1900年1月2日まで

print dateadd(week, datediff(week, 0, '27 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '28 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '29 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '30 jan 2012 00:00'),1) 
print dateadd(week, datediff(week, 0, '31 jan 2012 00:00'),1) 
1

これはset datefirst 1は月曜日と週の最初の日を設定することを

set datefirst 1 
select dateadd(day, -1 * (datepart(weekday, getdate()) - 1), getdate()) 

注意をグループ化する目的のために、週の最初の日に日付を変換する必要があります。この声明を変更して、曜日の最初の曜日を期待通りに変更することができます(http://msdn.microsoft.com/en-us/library/ms181598.aspx参照)

+0

私はそれが間違っていると思います。 'DATEDIFF()'は 'DATEFIRST'の値を見ません。 –

+0

ありがとうAndy、私は、日、週の月などでグループ化の 'すべてをキャッチする'構文があることを望んでいたと思うが、私はそうは思わない。 –

+0

@aF。だから私はDATEDIFFを使用していないのです:-) –

関連する問題