按最近的周末结束日期过滤的脚本

Script to filter by most recent end of week date

我公司的报告周是周一到周日。在星期一早上,我 运行 使用 Microsoft SQL Server Management Studio 进行了几次查询,以报告上周的业务 activity。我目前使用声明语句来提取所需的日期范围。只要我周一 运行ning 报告,这就很有效。但是,如果星期一是假期并且我要到星期二才 运行 宁报告,我需要为每个查询手动修改我的日期范围。我如何修改我的日期过滤器以通过之前的 "Sunday" 检索记录,这样我实际 运行 报告的日期并不重要。

这是一个示例查询;

Declare @DATEFROM SMALLDATETIME = (CONVERT(datetime, getdate() + cast('00:00' as datetime)) - 8), @DATETO smalldatetime = (CONVERT(datetime, getdate() + cast('23:59' as datetime))-2);

Create Table #SALES ([PartNumber] CHAR(5), [DateSold] SMALLDATETIME)

Insert Into #SALES   Select   '10190',  '6/3/2018 11:00'
Insert Into #SALES   Select   '10213',  '6/8/2018  8:00:00 AM'
Insert Into #SALES   Select   '10214',  '6/5/2018  9:30:00 AM'
Insert Into #SALES   Select   '10215',  '6/4/2018  1:00:00 PM'
Insert Into #SALES   Select   '10217',  '6/6/2018  1:00:00 PM'
Insert Into #SALES   Select   '10219',  '6/7/2018  12:00:00 PM'
Insert Into #SALES   Select   '10220',  '6/9/2018  3:30:00 PM'

Insert Into #SALES   Select   '10221',  '6/11/2018  8:30:00 AM'
Insert Into #SALES   Select   '10222',  '6/11/2018  2:30:00 PM'
Insert Into #SALES   Select   '10225',  '6/8/2018  8:00:00 AM'
Insert Into #SALES   Select   '10227',  '6/10/2018  9:00:00 AM'
Insert Into #SALES   Select   '10231',  '6/10/2018  1:00:00 PM'
Insert Into #SALES   Select   '10233',  '6/2/2018  8:00:00 AM';

SELECT S.PartNumber, S.DateSold 
FROM #SALES S 
WHERE DATESOLD BETWEEN @DATEFROM AND @DATETO 
ORDER BY DateSold;

DROP TABLE #SALES
Declare @DATEFROM datetime = DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0), 
@DATETO datetime = DATEADD(ms, -3, (select DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 7)));

首先,几个感兴趣的项目:

  • SQL 服务器的 SET DATEFIRST 命令允许您选择任何工作日作为一周的第一天,从 1(星期一)到 7(星期日)。
  • 您可以使用表达式 @@datefirst.
  • 查询此设置的当前值
  • DATEPART(weekday, getdate()) 将 return 当前工作日的数字,其中 1 表示 SET DATEFIRST 设置的日期,2 表示后一天,依此类推。

所以假设我想回答这个问题:最近的星期一是某个任意日期 @TestDate 之前的多少天?自最近的一周开始以来已经过去的天数是 DATEPART(weekday, @TestDate) - 1,星期一和一周开始之间过去的天数是 @@datefirst - 1,所以天数自最近一个星期一以来过去的数量是这些数量的模 7 的总和:

declare @TestDate date = convert(date, getdate());
declare @DaysPastMonday int = (@@datefirst + datepart(weekday, @TestDate) - 2) % 7;

有了这些信息,您可以很容易地得到您的日期范围:

declare @DateTo date = dateadd(day, -@DaysPastMonday, @TestDate);
declare @DateFrom date = dateadd(day, -7, @DateTo);

但请注意,我在此处选择的两个日期都是星期一,而您希望从星期一到星期日。我这样做的原因是,如果您要查看可能具有时间分量和日期(例如 datetimedatetime2)的字段,并且您想使用 BETWEEN,那么您需要确保您的结束日期具有 SQL 服务器能够表示的最晚一天中的时间。我发现使用包含开始日期和不包含结束日期的日期范围更清晰。所以代替这样的表达式:

x BETWEEN @DateFrom AND @DateTo

您将使用如下表达式编写查询:

x >= @DateFrom AND x < @DateTo