Sql server SQL工作日函数
我试图计算出前5个工作日,如果是周六或周日,则需要使用周五作为最后一个工作日 我得到了这个查询的if-else部分,但是当我尝试使用它来创建一个函数时,我得到了错误消息,有什么想法我错过了吗Sql server SQL工作日函数,sql-server,tsql,stored-functions,Sql Server,Tsql,Stored Functions,我试图计算出前5个工作日,如果是周六或周日,则需要使用周五作为最后一个工作日 我得到了这个查询的if-else部分,但是当我尝试使用它来创建一个函数时,我得到了错误消息,有什么想法我错过了吗 create table holidays ( date date); GO create function dbo.WorkDays ( @date datetime, @days int ) returns date as Begin IF datename(dw,@date
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
显示的错误是:
函数中包含的Select语句无法向客户端返回数据
您需要声明@return变量,并将其分配给每个select语句的输出:
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
我想你询问的逻辑是正确的
USE [DBName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fnGetWorkdays]
(
@f datetime=null,@t datetime=null
)
RETURNS int
AS
BEGIN
declare @retVal int=0
set @retVal=(
select count(DyName) as DayCnt
from CalenderInfo where
DteName between @f and @t and DyName not in('Friday')
and DteName not in
( select Fromdate from HolidayInfo where Fromdate between @f and @t )
)
return @retVal
END
表1:压延信息
DayID int
DyName varchar(20)
DteName datetime
表2:度假信息
HolidayDetailsID int
HolidayID int
HolydayName varchar(100)
Fromdate datetime
Todate datetime
IsPublic int
IsCalculated int
IsInactive int
能告诉我们错误信息是什么吗?