-3

SQL Serverで月の週ごとに日付をグループ化する方法はありますか?

例えば

Week 2: 05/07/2012 - 05/13/2012
Week 3: 05/14/2012 - 05/20/2012

しかし、SQLサーバーステートメントを使用

私は試した

SELECT SOMETHING, 
     datediff(wk, convert(varchar(6), getdate(), 112) + '01', getdate()) + 1 AS TIME_
FROM STATISTICS_
GROUP BY something, TIME_
ORDER BY TIME_

ただし、月の週番号を返します。(3を意味します)

今週の日のペアを取得するにはどうすればよいですか?

たとえば、今は3週目(3週目)になります。 05/14/2012 - 05/20/2012

私はどういうわけか解決しました:

SELECT DATEADD(ww, DATEDIFF(ww,0,<my_column_name>), 0)

select DATEADD(ww, DATEDIFF(ww,0,<my_column_name>), 0)+6

その後、2日間取得し、後で連結します。

4

4 に答える 4

3

よし、ここで我慢して。週の定義に該当する月の前後の日(月曜日から日曜日)を含む、今月を表す一時的なカレンダーテーブルを作成します。プロセスを明確にするために多くのステップでこれを行いますが、この場合はおそらくそれが得意ではありません。

その後、さまざまな週の範囲を生成し、それを使用して他のテーブルと結合することができます。

SET DATEFIRST 7;
SET NOCOUNT ON;

DECLARE @today SMALLDATETIME, @fd SMALLDATETIME, @rc INT;

SELECT @today = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0), -- today
    @fd = DATEADD(DAY, 1-DAY(@today), @today), -- first day of this month
    @rc = DATEPART(DAY, DATEADD(DAY, -1, DATEADD(MONTH, 1, @fd)));-- days in month

DECLARE @thismonth TABLE (
    [date]       SMALLDATETIME,
    [weekday]    TINYINT,
    [weeknumber] TINYINT 
);

;WITH n(d) AS (
    SELECT TOP (@rc+12) DATEADD(DAY, ROW_NUMBER() OVER 
    (ORDER BY [object_id]) - 7, @fd) FROM sys.all_objects
)
INSERT @thismonth([date], [weekday]) SELECT d, DATEPART(WEEKDAY, d) FROM n;

DELETE @thismonth WHERE [date] < (SELECT MIN([date]) FROM @thismonth WHERE [weekday] = 2)
                     OR [date] > (SELECT MAX([date]) FROM @thismonth WHERE [weekday] = 1);

;WITH x AS ( SELECT [date], weeknumber, rn = ((ROW_NUMBER() OVER 
   (ORDER BY [date])-1) / 7) + 1 FROM @thismonth ) UPDATE x SET weeknumber = rn;

-さて、最後のクエリはそれをすべて与えました(私はこれを分割して垂直スクロールバーを取り除くだけです):

;WITH ranges(w,s,e) AS (
    SELECT weeknumber, MIN([date]), MAX([date]) FROM @thismonth GROUP BY weeknumber
)
SELECT [week] = CONVERT(CHAR(10), r.s, 120) + ' - ' + CONVERT(CHAR(10), r.e, 120)

 --, SOMETHING , other columns from STATISTICS_?

 FROM ranges AS r

 -- LEFT OUTER JOIN dbo.STATISTICS_ AS s
 -- ON s.TIME_ >= r.s AND s.TIME_ < DATEADD(DAY, 1, r.e) 

 -- comment this out if you want all the weeks from this month: 
 WHERE w = (SELECT weeknumber FROM @thismonth WHERE [date] = @today)

 GROUP BY r.s, r.e --, SOMETHING
 ORDER BY [week];

WHERE句の結果:

week
-----------------------
2012-05-14 - 2012-05-20

WHERE句のない結果:

week
-----------------------
2012-04-30 - 2012-05-06
2012-05-07 - 2012-05-13
2012-05-14 - 2012-05-20
2012-05-21 - 2012-05-27
2012-05-28 - 2012-06-03

わざとYYYY-MM-DDを選んだことに注意してください。特に入力だけでなく表示についても、M / D/Yのような地域フォーマットは避けてください。視聴者がどれほどターゲットを絞っていても、2012年5月7日は5月7日ではなく7月5日だと思っている人が必ずいますYYYY-MM-DDを使用すると、あいまいさはまったくありません。

于 2012-05-18T13:31:25.533 に答える
2

カレンダーテーブルを作成すると、週番号、特定の週と月の最初/最後の日などをクエリできます。また、クエリに参加して日付範囲などを取得することもできます。

于 2012-05-18T12:40:35.640 に答える
0

ケースステートメントはどうですか?

case when datepart(day, mydatetime) between 1 and 7 then 1
     when datepart(day, mydatetime) between 8 and 14 then 2
     ...

同じグループにすべての週1が必要な場合を除き、年と月も含める必要があります。

于 2012-05-18T12:38:41.177 に答える
0

「日付を月の週でグループ化する」か、あるいは「特定の週からデータを選択する」かは明確ではありません。

「グループ」を意味する場合、この小さなスニペットは「月の週」を取得するはずです。

SELECT   <stuff>
FROM     CP_STATISTICS
WHERE    Month(<YOUR DATE COL>) = 5 --april
GROUP BY  Year(<YOUR DATE COL>), 
          Month(<YOUR DATE COL>),
          DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, <YOUR DATE COL>), 0)
           , <YOUR DATE COL>) +1

または、「4月の第1週の販売、日付順」が必要な場合は、次のようにすることができます。

DECLARE @targetDate datetime2 = '5/3/2012'
DECLARE @targetWeek int = DATEDIFF(week, DATEADD(MONTH, 
                             DATEDIFF(MONTH, 0, @targetDate), 0), @targetDate) +1


SELECT   <stuff>
FROM     CP_STATISTICS
WHERE    MONTH(@targetDate) = Month(myDateCol) AND
         YEAR(@targetDate)  = Year (myDateCol) AND 
         @targetWeek = DATEDIFF(week, DATEADD(MONTH, 
                                DATEDIFF(MONTH, 0, myDateCol), 0), myDateCol) +1
ORDER BY myDateCol

非標準の週を使用する場合、または月の境界にまたがる週の前の月の数日に到達したい場合は、状況がより複雑になることに注意してください。

編集2

'解決済み'セクションを見てから。あなたの質問は、「特定の週のテーブルからデータを取得するにはどうすればよいですか?」ということだと思います。

あなたの解決策は次のように見えます:

DECLARE @targetDate datetime2 = '5/1/2012'
DECLARE @startDate  datetime2 = DATEADD(ww, DATEDIFF(ww,0,targetDate), 0)
DECLARE @endDate    datetime2 = DATEADD(ww, DATEDIFF(ww,0,@now), 0)+6

SELECT  <stuff>
FROM    STATISTICS_
WHERE   dateStamp >= @startDate AND dateStamp <= @endDate

日付が5/1の場合、このソリューションの開始日が「2012年4月30日」になることに注意してください。あなたのソリューションが月の境界を越えるので、私はこれを指摘します。これは望ましい場合と望ましくない場合があります。

于 2012-05-18T12:40:40.323 に答える