1-й день месяца до предыдущей субботы - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь отфильтровать данные, чтобы они включали только первый день месяца до предыдущей субботы.Например, если я выполнил запрос 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 голосов
/ 14 июня 2019

Вы можете попробовать этот запрос.

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

И вы можете увидеть живое демо Здесь .

0 голосов
/ 14 июня 2019

Проверьте это-

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...