在SQL Server中查找上周的第一天

Sho*_*hel 0 sql sql-server sql-server-2012

我有一些日期和星期数,SQL Server中的一周的第一天是5(星期五)。现在,我想从下面的查询中计算上周和上周的开始日期。

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
Run Code Online (Sandbox Code Playgroud)

该查询的当前结果:

在此处输入图片说明

预期结果:

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
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗?谢谢

Lie*_*sel 6

这是一些方便的方法,可根据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)';
Run Code Online (Sandbox Code Playgroud)

(免费博客促销https://www.rednotebluenote.com/2016/04/first-day-of-the-week-and-datefirst/