上周五有两种锻炼方法,一种使用DATEFIRST,另一种使用第 0 天是星期一的巧合。
将DATEFIRST 设置为 6(星期六),然后计算上一个工作日结束:
SET DATEFIRST 6
SELECT CAST(DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), GETDATE()) AS DATE) 'Last Friday';
或者查找最近一周的开始时间(星期一)并倒数三天:
SELECT CAST(DATEADD(DAY, -3 , DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE()),0)) AS DATE) 'Last Friday'
我更喜欢前者,但由于您要明确寻找星期五,而不是特定于区域设置的工作日结束,因此您可以接受后者。
剩下的就是插入标准的 First/Last DATEADD/DATEDIFF 模式。这些应该可以满足您的需求:
DECLARE @LastFriday DATE = DATEADD(DAY, -3 , DATEADD(WEEK,DATEDIFF(WEEK,0,GETDATE()),0));
SELECT
LastFriday = @LastFriday,
PriorWeekStart = DATEADD(DAY, -6, @LastFriday),
MonthStart = CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, @LastFriday), 0) AS DATE),
QuarterStart = CAST(DATEADD(QUARTER, DATEDIFF(QUARTER, 0, @LastFriday), 0) AS DATE)
LastFriday PriorWeekStart MonthStart QuarterStart
---------- -------------- ---------- ------------
2016-07-29 2016-07-23 2016-07-01 2016-07-01