2016-03-30 14 views
0

Ich versuche, die letzten 5 Arbeitstage zu erarbeiten, wenn es ein Samstag oder Sonntag ist, dann muss Freitag als letzter Arbeitstag verwendet werden.SQL Arbeitstage Funktion

Ich habe den if else Teil dieser Abfrage funktioniert, aber wenn ich versuche, dies zu verwenden, um eine Funktion zu erstellen, die Fehlermeldungen erhalten, irgendwelche Ideen, was ich verpasst habe?

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

Möchten Sie uns sagen, was die Fehlermeldungen sind? – dfundako

Antwort

0

Fehler zeigte ist: Select-Anweisungen in einer Funktion enthalten kann keine Daten an einen Client zurückgeben.

Sie benötigen einen @return Variable zu deklarieren und die Ausgabe jeder select-Anweisung zuweisen:

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 

ich die Logik Ihrer Fragen annehmen, richtig ist.

+0

Brilliant danke dafür, sieht aus als hätte es funktioniert :) – user3691566