Исключить выходные из моего запроса

У меня есть запрос, который работает нормально. Запрос в основном извлекает данные в возрасте от 6 до 8 дней с текущей даты. Я хотел бы исключить выходные при измерении возраста данных.

Пример: если запись зарегистрирована в пятницу, то в понедельник утром она будет отображаться как 4-дневная, но на самом деле ей всего 2 дня, потому что суббота и воскресенье не должны учитываться.

Я пробовал это, что, похоже, не работает:

Select id, name, CreatedDate
from table
where 
CreatedDate <= DATEADD(day, -6, GETDATE()) AND CreatedDate >= DATEADD(day, -8, GETDATE()) -- here I get data between 6-8 days old
 AND ((DATEPART(dw, CreatedDate) + @@DATEFIRST) % 7) NOT IN (0, 1) -- Here im trying to exclude weekends

Что я делаю не так?


person MishMish    schedule 10.04.2017    source источник


Ответы (3)


Вы можете посмотреть календарь и попробовать этот запрос

// Logic is very simple. 
// See calendar and try.
// If today is Monday, then Prev8workingdays will include 
// 8 working days + 2 weekends = 12 days. 
// Then result will be dateadd(day,-12, getdate()) = 12 days before today.
// Same logic for other days week
DECLARE @Prev8workingdays date = CASE
    WHEN datepart(dw, getdate()) IN (2,3,4) THEN dateadd(day,-12, getdate()) 
    WHEN datepart(dw, getdate()) IN (1) THEN dateadd(day,-11, getdate()) 
    ELSE dateadd(day,-10, getdate())
    END
DECLARE @Pre6WorkingDay date = CASE
        WHEN datepart(dw, getdate()) IN (2) THEN dateadd(day,-10, getdate()) 
        WHEN datepart(dw, getdate()) IN (1) THEN dateadd(day,-9, getdate()) 
        ELSE dateadd(day,-8, getdate())
    END

SELECT sd.* FROM
@SampleDate sd
WHERE sd.CreatedDate >= @Prev8workingdays AND sd.CreatedDate <= @Pre6WorkingDay

Справочная ссылка DATEADD

person TriV    schedule 10.04.2017
comment
Привет, я только что попробовал это. Таким образом, в основном это будет измерять возраст записи без учета выходных? Можете ли вы объяснить, что делает dateadd(day,-12) и (-11)? Что делать, если я хочу измерить последние 5 дней? - person MishMish; 11.04.2017

можешь попробовать:

     WHERE DATEPART(dw, date_created) NOT IN (1, 7);
person SergeS    schedule 10.04.2017
comment
Это будет работать, предполагая, что DATEFIRST = 7. Кроме того, я бы просто сказал день недели вместо dw для ясности. - person scsimon; 10.04.2017
comment
Будет ли это измерять возраст данных без учета выходных в измерении? - person MishMish; 10.04.2017
comment
Нет, это замена AND ((DATEPART(dw, CreatedDate) + @@DATEFIRST) % 7) NOT IN (0, 1) - person SergeS; 10.04.2017

Попробуй это:

Select id, name, CreatedDate
from table
where CreatedDate < GETDATE()-6 and CreatedDate > GETDATE()-8 and
((DATEPART(dw, CreatedDate) + @@DATEFIRST) % 7) NOT IN (0, 1)
person Simran    schedule 10.04.2017
comment
Будет ли это измерять возраст данных без учета выходных в измерении? - person MishMish; 11.04.2017