5

ステータスごとに週ごとにバグの数を計算するクエリ(バグtracker.netで使用するため)があります。しかし、クエリは週番号を返します。私が本当に欲しいのは週の最初の日付です

select datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date)))
       as [week], bg_status , st_name as [status], count(*) as [count] 
  from bugs inner join statuses on bg_status = st_id 
 group by datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))),
          bg_status, st_name
 order by [week], bg_status

週番号を取得する部分は

datepart(wk, DateAdd(day, 0, DateDiff(day, 0, bg_reported_date))) as [week]

次の出力を返します。

week        bg_status   status                                        count
----------- ----------- --------------------------------------------- ------
22          1           new                                           1
22          5           closed                                        32

ただし、毎週の最初の日付を言う方がよいでしょう。たとえば、2010年1月1日、次に2010年8月1日などです。

質問は重複していませんSQLServerの週番号から「週の開始日」と「週の終了日」を取得するにはどうすればよいですか。(回答は、週番号からではなく、日付から週の開始を取得する方法を示しています)

週番号から日付を計算するのと重複していません(質問はc#を要求します)

提供された日付から週の最初の日付を取得するのと重複していません(質問はjavascriptを要求します)

検索しましたが、SQL Serverについて回答されたこの質問が見つかりませんでした(重要な場合は2010)

4

2 に答える 2

5

あなたがそれを正しい方法で考えるならば、SO1267126への答えはあなたの問題に適用することができます。

グループにあるバグ報告の各日付は、同じ週にマップされます。したがって、定義上、これらのバグの日付はそれぞれ、同じ週の始まりにマップする必要があります。したがって、バグレポートの日付に対して「指定された日付からの週の開始」の計算と週番号の計算を実行し、両方の(適度に恐ろしい)式でグループ化して、求める答えを取得します。

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date)
       AS [weekstart], bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1), bg_reported_date),
       bg_status, st_name
 ORDER BY [week], bg_status

はDATETIMEであるためbg_reported_date(コメントを参照。時間コンポーネントが含まれています)、週の開始を決定する前にDATEにキャストする必要があります(ただし、週番号式にはキャストは必要ありません。また、「曜日」も必要ありません。週の開始式の一部にもキャストは必要ありません):

SELECT DATEPART(wk, DATEADD(day, 0, DATEDIFF(d, 0, bg_reported_date))) [week],
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE)) AS [weekstart],
       bg_status, st_name AS [status], COUNT(*) AS [count] 
  FROM bugs INNER JOIN statuses ON bg_status = st_id 
 GROUP BY DATEPART(wk, DATEADD(day, 0, DATEDIFF(day, 0, bg_reported_date))),
       DATEADD(dd, -(DATEPART(dw, bg_reported_date)-1),
               CAST(bg_reported_date AS DATE),
       bg_status, st_name
 ORDER BY [week], bg_status

注意:テストされていないコードです!

于 2010-07-26T01:03:53.577 に答える
0

これは非常に古いスレッドだと思いますが、「週番号を指定して、週の最初の日付を取得する」はまさに私がやりたかったことであり、実際に作業する日付がないため、受け入れられた回答は自分。後世のために自分の解決策を投稿しようと思いました。異なるカルチャ設定がこれを壊す可能性があることに注意してください。使用する前にテストしてください。

私の答えはこれから始まります

週番号と年がわかっていて、その年のその週の開始日と終了日を取得したいとします。これが私が持っているものです:

--These 2 "declared" variables would be passed in somehow
declare @WeekNumber int = DATEPART(wk, GETDATE())
declare @ForYear int = YEAR(GETDATE())-1

--Since we don't have a raw date to work with, I figured I could just start with 
--Jan 1 of that year.  I'll store that date in a cte here, but if you are doing this
--in a stored proc or function, it would make much more sense to use another @variable
;with x as
(
    --this method works in SQL 2008:
    SELECT CONVERT(DateTime, ('1/1/' + CONVERT(varchar, @ForYear))) as Jan1ForSelectedYear
    --If you are using 2014 or higher, you can use this instead:
    --DATETIME2FROMPARTS(@ForYear, 1, 1, 0,0,0,0,0)
)
--Now that we have a date to work with, we'll just add the number of weeks to that date
--That will bring us to the right week number of the given year.
--Once we have THAT date, we can get the beginning and ending of that week
--Sorry to make you scroll, but I think this is easier to see what is going on this way
SELECT  CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear) - 6, x.Jan1ForSelectedYear))), 101) as FirstDayOfWeekXForSelectedYear,
        CONVERT(varchar(50), DateAdd(wk, (@WeekNumber - 1), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, x.Jan1ForSelectedYear)    , x.Jan1ForSelectedYear))), 101) as LastDayOfWeekXForSelectedYear
FROM x
于 2015-07-23T22:30:57.053 に答える