2017-03-12 13 views
1

指定された日付に従って、週の最初と最後の日付を計算するクエリがあります。 @dDateを設定すれば十分であり、その週の最初の(月曜日)と最後の日(日曜日)が計算されます。週の開始日と終了日が正しく計算されていません

問題は、それは間違って計算され、私はなぜ理解していません。

例:

@dDate = 2019-10-03 (year-month-day). 

結果:

W_START  W_END 
2019-09-25 2019-10-01 

しかし、それは次のようになります。なぜそれが

2019-09-30 2019-10-06 

のですか?

クエリ:週の

set datefirst 1 
declare @dDate date = cast('2019-10-16' as date) 
select @dDAte 
declare @year int = (select DATEPART(year, @dDAte)) 
select @year 
declare @StartingDate date = cast(('' + cast(@year as nvarchar(4)) + '-01-01') as date) 
select @StartingDate 


declare @dateWeekEnd date = (select DATEADD(week, (datepart(week, cast(@dDate as date)) - 1), @StartingDate)) 
declare @dateWeekStart date = dateadd(day, -6, @dateWeekEnd) 

select @dateWeekStart W_START, @dateWeekEnd W_END 

答えて

3

日はので複雑です。私は2001-01-01が月曜日に落ちたことを覚えておくほうが簡単です。

次に、以下の日付計算は、あなたが欲しいものを行います。

select dateadd(day, 
       7 * (datediff(day, '2001-01-01', @dDate)/7), 
       '2001-01-01' -- 2001-01-01 fell on a Monday 
      ) 

私は、これは警官アウト/ハックのようなものである認めます。しかし、SQL Serverや他のデータベースでは、このような単純な技が覚えておくと便利なように、このような日付演算を非常に面倒にしています。

+0

クエリでは、DATEFIRST = 1を設定する必要はありませんか?今週の最初の日はいつも月曜日ですか? @FrenkyB。 – FrenkyB

+1

。 。 2001-01-01が月曜日に落ちたという事実を利用しています。その事実は 'DATEFIRST'の影響を受けません。その事実は言語設定の影響を受けません。その事実は他の国際化設定の影響を受けません。その事実はデータベースとオペレーティングシステムに関係なく真であり、類似のロジックをデータベース間で使用することができます(構文は大きく異なります)。 –

+0

答えをいただきありがとうございます。あなたが時間を見つけたら、別の質問に目を通すことができます:http://stackoverflow.com/questions/42758099/number-of-week-between-two-days-calculated-wrong – FrenkyB

関連する問題