0

正しく動作するストアド プロシージャがありますが、それが動作する理由の理論がわかりません。datepart と密なランクを利用して、連続した期間を特定しています (他の場所で解決策を見つけました)。

        select 
            c.bom
            ,h.x
            ,h.z
            ,datepart(year, c.bom) * 12 + datepart(month, c.bom) -- this is returning a integer value for the year and month, allowing us to increment the number by one for each month
            - dense_rank() over ( partition by h.x order by datepart(year, c.bom) * 12 + datepart(month, c.bom)) as grp -- this row does a dense rank and subtracts out the integer date and rank so that consecutive months (ie consecutive integers) are grouped as the same integer

        from 
            #c c

            inner join test.vw_info_h h
            on h.effective_date <= c.bom
            and (h.expiration_date is null or h.expiration_date > c.bom)

グループ化機能で何が起こっているかを理論的に理解しています。

年 * 12 + 月の掛け算はどのように機能しますか? なぜ年を掛けるのですか?バックエンドで何が起きているのか?

4

1 に答える 1

1

日付の年部分は整数値です。1 年は 12 か月なので、年の値に 12 を掛けると、その年の最初の月までに経過した合計月数が得られます。

これが例です。2012 年 2 月 11 日 (CCYYMMDD 形式の 20120211) の日付を取得します。

2012 * 12 = 時間自体の開始から 24144 か月。

24144 + 2 か月 (2 月) = 24146.

年の値に 1 年の月数を掛けると、1 年の終了と別の年の開始の間のエッジ ケースを処理するためのコーディングを行うことなく、月に関連するオフセットを確立できます。例えば:

2011 年 11 月 -> 24143 2011 年 12 月 -> 24144 2012 年 1 月 -> 24145 2012 年 2 月 -> 24146

于 2012-10-19T17:41:28.743 に答える