_ = __ - __
1つではないにしても、これはすべて良いでしょう。 新しい月はほとんどの場合、週の半ばから始まります。 また、前月が22週目で終了した場合、今月も22週目から開始する可能性が高くなります。 減算を開始すると、ゼロ(22-22)、0、1、2 ...無秩序から始まる月を取得します。 旧月が終了して新しい月が始まった週が一致した場合、週数に1を追加するように、何かをする必要があります。 部門を活用してください。 整数(int)を除算すると、除算の結果も整数になり、小数部分は破棄されます。 このように
_ = __ + (__/__ - __)
これで、月の週の番号付けがゼロからではなく、1から正しく開始されます。 それだけですか? まだです。 今年の最初の月、つまり1月が見えなくなりました。 先週の最初の週、前月、つまり昨年の12月の最後の週から減算すると、-52(1-53)は必要なものではありません。 通常、不要な数を取り除くには、ゼロを掛けます。 同じことをします。 月が最初の場合、その週から減算する必要がある数値に0を掛け、月が最初でない場合、1を掛けるようにします。 ここで、整数の除算は、累乗に加えて、私たちにも役立ちます。 このように:
2 - 2 1/X
これで、月の週を見つける方程式は次のようになります。
_ = __ + (__/__ - __)(2 - 2 1/_ )
これらすべてをTransact SQLに変換しましょう
: DATEPART(wk, @dt)
: DATEPART(wk, DATEADD(MONTH, MONTH(@dt)-1, convert(date,DATENAME(yy, @dt))))
: DATEPART(wk, DATEADD(DAY, -1, DATEADD(MONTH, MONTH(@dt)-1, convert(date,DATENAME(yy, @dt)))))
このような扱いにくい表現が得られます。
DATEPART(wk, @dt) + (DATEPART(wk, DATEADD(DAY, -1, DATEADD(MONTH, MONTH(@dt)-1, convert(date,DATENAME(yy, @dt)))))/DATEPART(wk,
DATEADD(MONTH, MONTH(@dt)-1, convert(date,DATENAME(yy, @dt)))) - DATEPART(wk, DATEADD(DAY, -1, DATEADD(MONTH, MONTH(@dt)-1,
convert(date,DATENAME(yy, @dt))))))*(2 - POWER(2, 1/MONTH(@dt)))
@dt変数に日付が含まれている場合、この式はこの日付が参照する月の週(1〜6)を返します。 ただし、これは面倒です。 ネットワークのオープンスペースには、はるかに短くエレガントなオプションがあります。 たとえば、これ:
DATEPART(week, @dt) - DATEPART(week, DATEADD(month, DATEDIFF(month, 0, @dt), 0))+1
。
うまくいくようです。