2016-03-30 2 views
0

Я пытаюсь выработать предыдущие 5 рабочих дней, если это суббота или воскресенье, тогда она должна использовать пятницу в качестве последнего рабочего дня.Функция рабочих дней SQL

Ive получил if, если часть этого запроса работает, но когда я пытаюсь использовать это для создания функции im, получающей сообщения об ошибках, любые идеи, которые пропустили ive?

create table holidays (
    date date); 
GO 



create function dbo.WorkDays 
(

@date datetime, 
@days int 

) 

returns date 

as 

Begin 

IF datename(dw,@date) = 'Saturday' 

select dateadd(dd,-1,thedate) 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 

Else If datename(dw,@date) = 'Sunday' 

select dateadd(dd,-1,thedate) 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 

Else 

select thedate 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 

End 

drop table holidays 
+1

Не забудьте сообщить нам, что такое сообщения об ошибках? – dfundako

ответ

0

Ошибка показал это: Выберите заявления, включенные в функции не может возвращать данные клиенту.

Вы должны объявить @return переменную и присвоить ему выход каждого оператора выбора:

create function dbo.WorkDays 
(

@date datetime, 
@days int 

) 

returns date 

as 

Begin 
DECLARE @return date 

IF datename(dw,@date) = 'Saturday' 

select @return = dateadd(dd,-1,thedate) 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 

Else If datename(dw,@date) = 'Sunday' 

select @return = dateadd(dd,-1,thedate) 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 

Else 

select @return= thedate 
    from (
    select thedate=dateadd(d,-v.day,cast(@date as date)), 
     rn=row_number() over (order by v.day), 
     weekday = datename(dw,dateadd(d,-v.day,cast(@date as date))) 
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))v(day) 
    left join holidays h on h.date = dateadd(d,v.day,cast(@date as date)) 
    where left(datename(dw,dateadd(d,-v.day,cast(@date as date))),1) <> 'S' 
) x 
    where @days = rn 


    return @return 
End 

Я полагаю, что логика ваших запросов правильно.

+0

Блестящая благодарность за это, похоже, сработала :) – user3691566

Смежные вопросы