3

MS SQL の DateDiff 関数は、2 つの日付の差を計算するときに交差する境界の数をカウントします。

残念ながら、それは私が求めているものではありません。たとえば、2012 年 6 月 1 日 -> 2012 年 6 月 30 日は 4 つの境界を越えますが、5 週間をカバーします。

月が交差する週数を取得するために実行できる別のクエリはありますか?

アップデート

私が求めているものを正確に明確にするために:

特定の月について、その月と交差する週数が必要です。

また、datediffを取得して追加するだけの提案については、機能しません。たとえば、2010 年 2 月は 4 週間しか交わりません。そして、DateDiff呼び出しは 4 を返します。つまり、単純に 1 を追加すると、間違った週数が残ることになります。

4

2 に答える 2

4

注意:適切な週の計算は、一般的に思っているよりも複雑です!

使用する場合Datepart(week, aDate)、「週」という概念について多くの仮定を行います。週は日曜日または月曜日に始まりますか? 第 1 週から第 5 週への移行にどのように対処しますか? 1 年の実際の週数は、使用する週の計算規則 (first4dayweek、weekOfJan1 など) によって異なります。

単に違いに対処したい場合は、使用できます

DATEDIFF('s', firstDateTime, secondDateTime) > (7 * 86400 * numberOfWeeks)

最初の dateTime が の場合2011-01-01 15:43:22、差は 5 週間後です2011-02-05 15:43:22

編集:実際には、この投稿によると: Wrong week number using DATEPART in SQL Server You can now use Datepart(isoww, aDate)to get ISO 8601 week number. week私はそれが壊れていることを知っていましたが、修正されたことは知りませんでした. 涼しい!

これは、月曜日を週の最初の曜日として使用している場合に機能します

 set language = british
 select datepart(ww, @endofMonthDate) - 
        datepart(ww, @startofMonthDate) + 1 
  1. Datepart は言語に依存します。言語を設定するbritishと、月曜日が週の最初の日になります。
  2. これにより、 2010 年 2 月と 2012 年 6 月の正しい値が返されます。(日曜日ではなく月曜日が週の最初の日であるため)。
  3. また、1月と12月の正しい週数を返すようです(年に関係なく)。このisowwパラメーターは月曜日を週の最初の日として使用しますが、1 月が 52/53 週に始まり、12 月が 1 週目に終わることがあります (select ステートメントがより複雑になります)。
于 2011-04-07T13:39:05.737 に答える
1

週を数える場合、 SET DATEFIRSTは重要です。あなたが持っているものを確認するには、select @@datefirstを使用できます。@@datefirst=7 は、週の最初の日が日曜日であることを意味します。

set datefirst 7

declare @FromDate datetime = '20100201'
declare @ToDate datetime = '20100228'

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1

2010 年 2 月 28 日日曜日は第 5 週の最初の日であるため、結果は 5 です。

週の最初の曜日が月曜日であることに基づいて週の計算を行いたい場合は、代わりにこれを行う必要があります。

set datefirst 1

declare @FromDate datetime = '20100201'
declare @ToDate datetime = '20100228'

select datepart(week, @ToDate) - datepart(week, @FromDate) + 1

結果は 4 です。

于 2011-04-07T13:31:12.420 に答える