毎週の週ナンバーと月曜日の日付でXレコードをリストするSQL

StackOverflow https://stackoverflow.com/questions/20353802

  •  25-08-2022
  •  | 
  •  

質問

その特定の週の週ナンバーのリストと月曜日の日付を提供するSQLクエリを探しています。

例えば:

WeekNumber  DateMonday
39          2013-09-23
40          2013-09-30
...         ...

次のジャストは1週間生産します

select
     (DATEPART(ISO_WEEK,(CAST(getdate() as DATETIME)))) as WeekNumber,
     DATEADD(wk, DATEDIFF(d, 0, CAST(getdate() as DATETIME)) / 7, 0) AS DateMonday
役に立ちましたか?

解決

数字テーブルがない場合は、システムテーブルを使用して、その場でシーケンシャル番号のリストを生成できます。

例えば

SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
FROM    sys.all_objects;

これをより多くの数値に対して拡張する必要がある場合は、参加テーブルをクロスすることができます。

SELECT  Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;

次に、開始日からこれらの週数を追加/減算する必要があります。

DECLARE @Monday DATE = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0);

WITH Numbers AS
(   SELECT  Number = ROW_NUMBER() OVER(ORDER BY object_id)
    FROM    sys.all_objects
)
SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, - n.Number, @Monday)
            FROM    Numbers n
        ) w;

これは、段階的な明確さのためにこれを行うための冗長な方法であり、次のように凝縮できます。

SELECT  WeekNumber = DATEPART(ISO_WEEK, w.DateMonday),
        w.DateMonday
FROM    (   SELECT  DateMonday = DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - ROW_NUMBER() OVER(ORDER BY object_id), 0)
            FROM    sys.all_objects
        ) w;

SQLフィドルの例

アーロン・バートランド 数字のシーケンシャルリストを生成する方法を深く比較しました。

もちろん、これを行う最も簡単な方法は、 カレンダーテーブル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top