2016-05-29 4 views
0

У меня есть некоторые даты и номера недели, а первый день недели - 5 (пятница) в SQL Server. Теперь я хочу рассчитать предыдущую дату недели и недели из этого ниже запроса.Найти первую дату предыдущей недели в 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

Вместо того, чтобы пытаться построить рекурсивную КТР для этого, возможно, было бы намного проще просто построить таблицу, как это, или, например, с помощью курсора или даже в 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

спасибо, но alos нужно номер предыдущей недели. – Shohel

+0

Ваш код уже имеет это - 'DATEPART (WEEK, ...)' –

Смежные вопросы