if
exists
(
select
*
from
dbo.sysobjects
where
id
=
object_id
(N
'
[tb_Holiday]
'
)
and
OBJECTPROPERTY
(id, N
'
IsUserTable
'
)
=
1
)
drop table [ tb_Holiday ]
GO
-- 定义节假日表
CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered , -- 节假日期
Name nvarchar ( 50 ) not null ) -- 假日名称
GO
if exists ( select * from dbo.sysobjects where id = object_id (N ' [dbo].[f_WorkDay] ' ) and xtype in (N ' FN ' , N ' IF ' , N ' TF ' ))
drop function [ dbo ] . [ f_WorkDay ]
GO
-- 计算两个日期之间的工作天数
CREATE FUNCTION f_WorkDay(
@dt_begin datetime , -- 计算的开始日期
@dt_end datetime -- 计算的结束日期
) RETURNS int
AS
BEGIN
IF @dt_begin > @dt_end
RETURN ( DATEDIFF ( Day , @dt_begin , @dt_end )
+ 1 - (
SELECT COUNT ( * ) FROM tb_Holiday
WHERE HDate BETWEEN @dt_begin AND @dt_end ))
RETURN ( - ( DATEDIFF ( Day , @dt_end , @dt_begin )
+ 1 - (
SELECT COUNT ( * ) FROM tb_Holiday
WHERE HDate BETWEEN @dt_end AND @dt_begin )))
END
GO
drop table [ tb_Holiday ]
GO
-- 定义节假日表
CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered , -- 节假日期
Name nvarchar ( 50 ) not null ) -- 假日名称
GO
if exists ( select * from dbo.sysobjects where id = object_id (N ' [dbo].[f_WorkDay] ' ) and xtype in (N ' FN ' , N ' IF ' , N ' TF ' ))
drop function [ dbo ] . [ f_WorkDay ]
GO
-- 计算两个日期之间的工作天数
CREATE FUNCTION f_WorkDay(
@dt_begin datetime , -- 计算的开始日期
@dt_end datetime -- 计算的结束日期
) RETURNS int
AS
BEGIN
IF @dt_begin > @dt_end
RETURN ( DATEDIFF ( Day , @dt_begin , @dt_end )
+ 1 - (
SELECT COUNT ( * ) FROM tb_Holiday
WHERE HDate BETWEEN @dt_begin AND @dt_end ))
RETURN ( - ( DATEDIFF ( Day , @dt_end , @dt_begin )
+ 1 - (
SELECT COUNT ( * ) FROM tb_Holiday
WHERE HDate BETWEEN @dt_end AND @dt_begin )))
END
GO
执行如下查询:
select dbo.f_workday('2006-01-01','2006-02-01')
select dbo.f_workday('2006-02-01','2006-01-01')
和理想结果相差悬殊啊。
虽然上本身就有逻辑的错误,但主要的问题不在这里。当时就怀疑实际语句的执行情况是否正确,测试后发现一个奇怪的问题。就是不管在函数还是存储过程中,return 后面加上确切的数字和简单的算术计算都没问题,都可以使函数或存储过程立刻返回。但是返回值中如果包含查询语句,如:return (select count(*) from TableName),那么函数或存储过程将继续执行,如果后面没有另外的return,外面得到的返回值倒是还能记得之前那个返回值(就是return (select count(*) from TableName)这句的返回值)。百思不得其解,网上随便查了查,没找到原因。难道return 后面的表达式不能是一个子查询?看看有哪位高手知晓其根本原因。