2016-09-13 2 views
0

У меня есть следующий запросSQL Последний рабочий день

select Case.casekey, LoginName, startdatedate, SenttoClientDate 
from case with (nolock) 
where SenttoClientDate = dateadd(day,-1, cast(getdate() as date)) 

Это возвращает результаты, где {senttoclientdate} = вчера.

Проблема в том, что если я запустил это в понедельник, я получу результаты воскресенья, но я хочу последний рабочий день. Поэтому, если я буду работать в понедельник, мне нужны результаты в пятницу.

+1

попробуйте CASE и WEEKDAY –

+0

Каков ожидаемый результат, если вы запустите запрос в воскресенье? – jarlh

+0

Что делать, если это вторник. и пн. был праздник? Для этого вам понадобится таблица рабочих дней, с вашими отпусками/независимо от них. – Beth

ответ

0

Вбрасывание в случае на DATEPART

where SentToClientDate = 
    case when datepart(dw,getdate()) = 2 then dateadd(day,-3,getdate()) -- Monday is day 2, for no reason whatsoever 
     else dateadd(day,-1,getdate()) 
    end 
0

Вы можете сделать это так:

WHERE SenttoClientDate = (SELECT DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE()) 
        WHEN 'Sunday' THEN -2 
        WHEN 'Monday' THEN -3 
        ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()))) 
0

В, где использование состояние корпуса, как показано ниже,

select Case.casekey, LoginName, startdatedate, SenttoClientDate 
    from case with (nolock) 
    where SentToClientDate = 
    case when datepart(dw,getdate()) = 2 then dateadd(day,-3,getdate()) 
     when datepart(dw,getdate()) = 1 then dateadd(day,-2,getdate()) 
     else dateadd(day,-1,getdate()) 
    end 
0

Можете ли вы попробовать с этим, это очень простое и идеальное решение:

SELECT Case.casekey, LoginName, startdatedate, SenttoClientDate 
FROM case with (nolock) 
WHERE SenttoClientDate = 
CAST(DATEADD(dd, 
    CASE WHEN DATEPART(weekday, GETDATE()) = 6 THEN 0 
    ELSE (6-(DATEPART(weekday, GETDATE())+7)) END, GETDATE()) AS DATE) 
Смежные вопросы