邹老大请进, 想请教一下您

marco08 2006-10-27 08:50:42
--定义节假日表
CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered, --节假日期
Name nvarchar(50) not null) --假日名称
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


/*
为什么条件判断是 @dt_begin>@dt_end ,如果 @dt_begin>@dt_end 则 WHERE HDate BETWEEN @dt_begin AND @dt_end 始终返回空记录集啊
*/
...全文
235 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
marco08 2006-10-30
  • 打赏
  • 举报
回复
up
marco08 2006-10-28
  • 打赏
  • 举报
回复
明天把参数改过来试试
gahade 2006-10-27
  • 打赏
  • 举报
回复
那就是参数是反着的。
@dt_begin = '2006-01-10'
@dt_end = '2006-01-01'
marco08 2006-10-27
  • 打赏
  • 举报
回复
between @a and @b 是 >=@a and <= @b 的关系啊
marco08 2006-10-27
  • 打赏
  • 举报
回复
但是
@dt_begin>@dt_end 时 WHERE HDate BETWEEN @dt_begin AND @dt_end --返回零条记录

@dt_begin<@dt_end 时 WHERE HDate BETWEEN @dt_end AND @dt_begin --返回零条记录
gahade 2006-10-27
  • 打赏
  • 举报
回复
看错了。

老大的意思是如果开始日期大于结束日期就会返回两日期间负的天数
如果开始日期小于结束天数就返回相关天数减去两日期间的节假日天数。
marco08 2006-10-27
  • 打赏
  • 举报
回复
declare @tb table(col1 int)
insert @tb select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6


select * from @tb where col1 between 2 and 4 --返回三条记录
select * from @tb where col1 between 4 and 2 --返回零条记录
--所以如果 @dt_begin>@dt_end 则 WHERE HDate BETWEEN @dt_begin AND @dt_end 返回零条记录
gahade 2006-10-27
  • 打赏
  • 举报
回复
没有说写错,是理解错了吧。呵呵
marco08 2006-10-27
  • 打赏
  • 举报
回复
没有写错, 我照样 COPY 过来的
gahade 2006-10-27
  • 打赏
  • 举报
回复
你看错了吧。
如果IF @dt_begin>@dt_end不成立是执行
RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
+1-(
SELECT COUNT(*) FROM tb_Holiday
WHERE HDate BETWEEN @dt_end AND @dt_begin)))
可以写成
--定义节假日表
CREATE TABLE tb_Holiday(
HDate smalldatetime primary key clustered, --节假日期
Name nvarchar(50) not null) --假日名称
GO

--计算两个日期之间的工作天数
CREATE FUNCTION f_WorkDay(
@dt_begin datetime, --计算的开始日期
@dt_end datetime --计算的结束日期
)RETURNS int
AS
BEGIN
IF @dt_begin>@dt_end
begin
RETURN(DATEDIFF(Day,@dt_begin,@dt_end)
+1-(
SELECT COUNT(*) FROM tb_Holiday
WHERE HDate BETWEEN @dt_begin AND @dt_end))
end
else
begin
RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
+1-(
SELECT COUNT(*) FROM tb_Holiday
WHERE HDate BETWEEN @dt_end AND @dt_begin)))
end
END
GO

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧