按最近的周末结束日期过滤的脚本
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);
但请注意,我在此处选择的两个日期都是星期一,而您希望从星期一到星期日。我这样做的原因是,如果您要查看可能具有时间分量和日期(例如 datetime
或 datetime2
)的字段,并且您想使用 BETWEEN
,那么您需要确保您的结束日期具有 SQL 服务器能够表示的最晚一天中的时间。我发现使用包含开始日期和不包含结束日期的日期范围更清晰。所以代替这样的表达式:
x BETWEEN @DateFrom AND @DateTo
您将使用如下表达式编写查询:
x >= @DateFrom AND x < @DateTo
我公司的报告周是周一到周日。在星期一早上,我 运行 使用 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);
但请注意,我在此处选择的两个日期都是星期一,而您希望从星期一到星期日。我这样做的原因是,如果您要查看可能具有时间分量和日期(例如 datetime
或 datetime2
)的字段,并且您想使用 BETWEEN
,那么您需要确保您的结束日期具有 SQL 服务器能够表示的最晚一天中的时间。我发现使用包含开始日期和不包含结束日期的日期范围更清晰。所以代替这样的表达式:
x BETWEEN @DateFrom AND @DateTo
您将使用如下表达式编写查询:
x >= @DateFrom AND x < @DateTo