首页 > 解决方案 > 每月第一天至上周六

问题描述

我正在尝试过滤数据以仅包括该月的第一天,直到上一个星期六。例如,如果我在 6-14-19(星期五)运行查询,则数据将仅包括 6-1-19 到 6-8-19(星期六)。

现在我只有一个月初至今的过滤器:

@SampleDate BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AND DATEADD(day, 0, CAST(GETDATE() AS date))

我想知道如何使用 GETDATE() 获取上周六的日期,这样我就可以替换当前月至今过滤器的上限。

编辑:我刚刚意识到特殊情况。如果前一周的星期六在上个月,那么我希望能够获得上个月的日期。例如,如果我在 5-1-19(星期三)运行此查询,那么我想要从 4-1-19 到 4-27-19(星期六)的数据。另一个问题是,如果今天是星期六,如果今天是星期六,那么我仍然需要前一个星期六的日期,而不是今天的日期。

标签: sqlsql-servertsql

解决方案


你可以试试这个查询。

declare @date datetime = getdate() --Todays date
select <Column1>,
    <Column2>,
    .........
    from <YourTableName>
where <YourDateColumn> between
    datefromparts(Year(@date), Month(@date), 1) -- First date of month
    and
    DATEADD(DAY, DATEDIFF(DAY, 5, @date) /7 * 7, 5) --Previous Saturday

您可以检查以下实现。

create table TableA(
    Name Varchar(50),
    DOJ Date
    )

Insert into TableA Values 
 ('A', '2019-06-01'), 
 ('B', '2019-06-02'),
 ('C', '2019-06-03'), 
 ('D', '2019-06-04'), 
 ('E', '2019-06-05'),
 ('F', '2019-06-15'), 
 ('G', '2019-06-06'), 
 ('H', '2019-06-08'), 
 ('I', '2019-06-09')

declare @date datetime = getdate() --Todays date
select 
    *
    from TableA
where DOJ between
    datefromparts(Year(@date), Month(@date), 1) -- First date of month
    and
    DATEADD(DAY, DATEDIFF(DAY, 5, @date) /7 * 7, 5) --Previous Saturday

输出如下图所示。

Name    DOJ
-----------------------
A   01.06.2019 00:00:00
B   02.06.2019 00:00:00
C   03.06.2019 00:00:00
D   04.06.2019 00:00:00
E   05.06.2019 00:00:00
G   06.06.2019 00:00:00
H   08.06.2019 00:00:00

如果您自己运行查询,Saturday那么要获得前一个Saturday,您可以从执行日期中减去一天。

declare @date datetime = '2019-06-15' --Todays date
if (DATENAME(weekday,@date))='Saturday'
begin
    set @date = DATEADD(DAY, -1, @date)
end

你可以在这里看到现场演示。


推荐阅读