求工作日的函数
来源:互联网 发布:ip网络电话软件 编辑:程序博客网 时间:2024/04/30 23:23
-----1.标准节假日
----------------------------------------------函数(求两个日期直接的工作日的数目)-------------------------------------------------------
--创建函数
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
DECLARE @workday int,@i int,@bz bit,@dt datetime
IF @dt_begin>@dt_end
SELECT @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt
ELSE
SET @bz=0
SELECT @i=DATEDIFF(Day,@dt_begin,@dt_end)+1,
@workday=@i/7*5,
@dt_begin=DATEADD(Day,@i/7*7,@dt_begin)
WHILE @dt_begin<=@dt_end
BEGIN
SELECT @workday=CASE
WHEN (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7 BETWEEN 1 AND 5
THEN @workday+1 ELSE @workday END,
@dt_begin=@dt_begin+1
END
RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)
END
GO
--使用
select dbo.f_WorkDay(开始日期,结束日期)
-------------------------------------函数(指定日期上,增加指定工作天数后的日期)---------------------------------------------
--创建函数
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDayADD]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_WorkDayADD]
GO
--在指定日期上,增加指定工作天数后的日期
CREATE FUNCTION f_WorkDayADD(
@date datetime, --基础日期
@workday int --要增加的工作日数
)
RETURNS datetime
AS
BEGIN
DECLARE @bz int
--增加整周的天数
SELECT @bz=CASE WHEN @workday<0 THEN -1 ELSE 1 END
,@date=DATEADD(Week,@workday/5,@date)
,@workday=@workday%5
--增加不是整周的工作天数
WHILE @workday<>0
SELECT @date=DATEADD(Day,@bz,@date),
@workday=CASE WHEN (@@DATEFIRST+DATEPART(Weekday,@date)-1)%7 BETWEEN 1 AND 5
THEN @workday-@bz ELSE @workday END
--避免处理后的日期停留在非工作日上
WHILE (@@DATEFIRST+DATEPART(Weekday,@date)-1)%7 in(0,6)
SET @date=DATEADD(Day,@bz,@date)
RETURN(@date)
END
--使用
select dbo.f_WorkDayADD('2009-11-1',8)
****************************************************************************
-----2.自定义节假日
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
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDayADD]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_WorkDayADD]
GO
--在指定日期上增加工作天数
CREATE FUNCTION f_WorkDayADD(
@date datetime, --基础日期
@workday int --要增加的工作日数
)RETURNS datetime
AS
BEGIN
IF @workday>0
WHILE @workday>0
SELECT @date=@date+@workday,@workday=count(*)
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
ELSE
WHILE @workday<0
SELECT @date=@date+@workday,@workday=-count(*)
FROM tb_Holiday
WHERE HDate BETWEEN @date AND @date+@workday
RETURN(@date)
END
- 求工作日的函数
- php求每个月正班工作日总数的小算法
- Java 求两个指定时间之间的工作日
- 求两个时间段间的工作日(周一到周五)
- 计算工作日函数
- Oracle计算正常公休或工作日的PL/SQL函数
- 日期函数的计算(计算两个日期的天数差,除去工作日(工作日表自己定义))
- 值班表日期的生成!(求给定时间段内的工作日的日期排序)
- 转贴:工作日的计算
- 一个平凡的工作日
- java 求两个日期间的工作日(无周六日)
- 工作日
- MS SQL2005 中标量值函数的灵活运用之工作日计算篇
- 【叶子函数分享二十三】计算两个日期之间的工作日
- 【叶子函数分享二十三】计算两个日期之间的工作日
- 编写SQL Server函数统计两日期间的工作日天数
- oracle的工作日计算实例
- .net实现工作日的计算
- 获取引发页面回传事件的控件
- 清空MySQL表中的所有内有和删除表的方法
- 使用J2SE处理Jar时生成Jar和Jad无内容
- Metalearning and ...?
- LWUIT 组件的简单介绍
- 求工作日的函数
- PHP发现一
- PLZ,introduce myself
- vmware LInuc 上网、共享文件与分区
- 在dataGridView中显示combobox
- Web 服务系列标准和规范
- HP 180G6服务器网卡驱动安装
- 深刻悼念钱老!
- 轻量级用户界面工具包(LWUIT)简介