一个月的第一天到上一个星期六

时间:2019-06-14 16:32:07

标签: sql sql-server tsql

我正在尝试过滤数据,使其仅包括每月的第一天直到上一个星期六。例如,如果我在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(星期六)的数据。另一个问题是,如果当前日期是星期六,如果今天当前是星期六,那么我仍然需要上一个星期六的日期,而不是今天的日期。

2 个答案:

答案 0 :(得分:0)

检查此-

DECLARE @RunDate DATE = '20190617'

SELECT 
CASE WHEN A.StartDate > A.EndDate THEN DATEADD(MM,-1, A.StartDate) ELSE A.StartDate END StartDate,  
A.EndDate 
FROM
(
    SELECT 
    CAST(DATEADD(DD,-(DATEPART(DD,@RunDate))+1,@RunDate) AS DATE) AS StartDate,
    CASE DATENAME(weekday,@RunDate)
        WHEN 'Saturday' THEN DATEADD(DD,-0,@RunDate)
        WHEN 'Sunday' THEN DATEADD(DD,-1,@RunDate)
        WHEN 'Monday' THEN DATEADD(DD,-2,@RunDate)
        WHEN 'Tuesday' THEN DATEADD(DD,-3,@RunDate)
        WHEN 'Wednesday' THEN DATEADD(DD,-4,@RunDate)
        WHEN 'Thursday' THEN DATEADD(DD,-5,@RunDate)
        WHEN 'Friday' THEN DATEADD(DD,-6,@RunDate)
    END AS EndDate
) A

答案 1 :(得分:0)

您可以尝试此查询。

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

您可以观看现场演示Here