我公司的报告周是周一到周日。在星期一早上,我使用Microsoft SQL Server Management Studio运行几个查询来报告上周的业务活动。我目前使用声明语句来拉出所需的日期范围。只要我在星期一运行报告,这种方法就能很好地运作。但是,如果星期一是假日,并且我在星期二之前没有运行报告,我需要手动修改每个查询的日期范围。如何修改我的日期过滤器以通过之前的"星期日"所以我实际运行报告的那一天并不重要。
这是一个示例查询;
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
答案 0 :(得分:2)
首先,一些感兴趣的项目:
SET DATEFIRST
命令允许您选择任何工作日作为一周的第一天,从1(星期一)到7(星期日)。SET DATEFIRST
。DATEPART(weekday, getdate())
将返回当前工作日的数字,其中1表示@TestDate
设置的日期,2表示后一天等,所以我想回答一个问题:在某个任意日期DATEPART(weekday, @TestDate) - 1
之前的几天是最近一个星期一?自最近一周开始以来经过的天数为@@datefirst - 1
,在星期一和一周开始之间经过的天数为declare @TestDate date = convert(date, getdate());
declare @DaysPastMonday int = (@@datefirst + datepart(weekday, @TestDate) - 2) % 7;
,因此天数自最近一个星期一以来已经过去的是模数为7的数量的总和:
declare @DateTo date = dateadd(day, -@DaysPastMonday, @TestDate);
declare @DateFrom date = dateadd(day, -7, @DateTo);
通过这些信息,您可以非常轻松地获得日期范围:
datetime
但请注意,我在这里选择的两个日期都是星期一,而你想要一个星期一到星期天。我这样做的原因是,如果你要查看可能有时间组件和日期的字段(例如datetime2
或BETWEEN
),那么你想要使用x BETWEEN @DateFrom AND @DateTo
,那么您需要确保结束日期具有SQL Server能够表示的最新时间。我发现使用包含在开始日期的日期范围和在结束日期独占的日期范围更清晰。所以代替这样的表达式:
x >= @DateFrom AND x < @DateTo
您要编写查询以使用如下表达式:
A a; // No initializer
答案 1 :(得分:0)
Declare @DATEFROM datetime = DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0),
@DATETO datetime = DATEADD(ms, -3, (select DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 7)));