2016-05-29 37 views
0

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 

このクエリの現在の結果:

enter image description here

期待される結果:

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 

は、あなたが私を助けることができますか?ありがとう

+0

代わりに、このために再帰CTEを構築しようとしているのは、どちらか、たとえばExcelでも、カーソルを使用するか、ちょうどこのようなテーブルを構築するために多くの方が簡単かもしれませんそれをデータベースに格納します。 –

+0

私は自分の質問を更新しました。ちょうど見てカーソルを使用しようとしないでください。 – Shohel

+0

私はSQLでカーソルを使用するのではなく、テーブルにデータを入力することを意味しました。それはすべてをよりシンプルにします。一度だけ行う必要があり、再帰的な方法を実行する可能性が非常に高いです。 –

答えて

4

私が数週間前にブログしたDATEFIRSTを尊重して、この/先週の最初/最後の日を計算する便利な方法があります。

SET DATEFIRST 5 --Friday 
-- Start/End of Weeks respecting DATEFIRST 
SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, GETDATE()), GETDATE()) 'First Day of Current Week (DATEFIRST)'; 
SELECT DATEADD(DAY, 7-DATEPART(WEEKDAY, GETDATE()), GETDATE()) 'Last Day of Current Week (DATEFIRST)'; 
SELECT DATEADD(DAY, -6-DATEPART(WEEKDAY, GETDATE()), GETDATE()) 'First Day of Last Week (DATEFIRST)'; 
SELECT DATEADD(DAY, 0-DATEPART(WEEKDAY, GETDATE()), GETDATE()) 'Last Day of Last Week (DATEFIRST)'; 

(無償ブログプロモーションhttps://www.rednotebluenote.com/2016/04/first-day-of-the-week-and-datefirst/

+0

ありがとうございますが、前週の番号が必要です。 – Shohel

+0

あなたのコードには既に--DATEPART(WEEK、...) –

関連する問題