SQL Server-年の週から月の週を調べる

私は質問に興味を持つようになりました、日付が与えられている場合、それがどの月に属するのかをどのように知るのですか? たとえば、2009年5月7日は5月の第2週であり、2009年6月15日は6月の第3週であることがわかります。 SQL Serverには、特定の日付が属する週(1〜53)を特定できる組み込み関数があります。 たぶんこれは助けになりますか? たとえば、前の月が終了した週を見つけて、現在の週から差し引くことができます。 たとえば、先月は22週目で終了し、新しい月は23週目、次の週は24週目、25週目...今月の各週のうち22週目を取り、それぞれ1、2、3 ...



_ = __ - __







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







うまくいくようです。



All Articles