SQL Serverでは、日付と週番号があり、週の最初の曜日は5(金曜日)です。今、私は前の週と週の開始日をこの下のクエリから計算したいと思います。SQL Serverの前週の最初の日付を検索
DECLARE @LocationID tinyint = 1,
@FromDate date = '2016-05-20',
@ToDate date = '2016-05-29';
--Step1: ==================================================================
--SET first day of the week of the year
DECLARE @CurrentDayOfWeek INT
SET DATEFIRST 1 -- normalize current dkoray of week to Monday
SET @CurrentDayOfWeek = DATEPART(DW, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0))
SET DATEFIRST @CurrentDayOfWeek -- first day of week is now 5 (Friday)
--SELECT @CurrentDayOfWeek
-----Get Weekend number--------------
DECLARE @WeekStart int, @WeekEnd int
SET @WeekStart=(SELECT { fn WEEK(@FromDate) })
SET @WeekEnd=(SELECT { fn WEEK(@ToDate) })
;WITH AllDate AS
(
SELECT @FromDate as TheDate
UNION ALL
SELECT DATEADD(DAY, 1, TheDate)
FROM AllDate
WHERE DATEADD(DAY, 1, TheDate) <= @ToDate
),
AllDateDetail AS
(
SELECT TheDate,
DATEPART(WEEK, TheDate) AS WeekNumber,
YEAR(TheDate) AS [Year],
UPPER(CONVERT(NVARCHAR(3),DATENAME(WEEKDAY, TheDate))) AS [DayName]
FROM AllDate
)
SELECT
*
, CONVERT(DATE,DATEADD(WK, DATEDIFF(WK, 0, TheDate), 0)) AS LastWeekStart
, { fn WEEK(CONVERT(DATE,DATEADD(WK, DATEDIFF(WK, 0, TheDate) - 1, 0))) } AS WeekNumber
FROM AllDateDetail
--Select dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) as LastWeekStart
--Select dateadd(wk, datediff(wk, 0, getdate()), 0) as ThisWeekStart
--Select dateadd(wk, datediff(wk, 0, getdate()) + 1, 0) as NextWeekStart
このクエリの現在の結果:
期待される結果:
TheDate WeekNumber [Year] [DayName] LastWeekStart LastWeekNumber
20-05-2016 21 2016 FRI 13-05-2016 20
21-05-2016 21 2016 SAT 13-05-2016 20
22-05-2016 21 2016 SUN 13-05-2016 20
23-05-2016 21 2016 MON 13-05-2016 20
24-05-2016 21 2016 TUE 13-05-2016 20
25-05-2016 21 2016 WED 13-05-2016 20
26-05-2016 21 2016 THU 13-05-2016 20
27-05-2016 22 2016 FRI 20-05-2016 21
28-05-2016 22 2016 SAT 20-05-2016 21
29-05-2016 22 2016 SUN 20-05-2016 21
は、あなたが私を助けることができますか?ありがとう
代わりに、このために再帰CTEを構築しようとしているのは、どちらか、たとえばExcelでも、カーソルを使用するか、ちょうどこのようなテーブルを構築するために多くの方が簡単かもしれませんそれをデータベースに格納します。 –
私は自分の質問を更新しました。ちょうど見てカーソルを使用しようとしないでください。 – Shohel
私はSQLでカーソルを使用するのではなく、テーブルにデータを入力することを意味しました。それはすべてをよりシンプルにします。一度だけ行う必要があり、再帰的な方法を実行する可能性が非常に高いです。 –