分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日)
来源:互联网 发布:网络八大虚拟人物名字 编辑:程序博客网 时间:2024/05/17 00:12
--计算两个日期之间相差的工作天数(本算法以2006-9-1至2006-9-30为例说明)
CREATE FUNCTION f_WorkDateDiff
( @dt_begin datetime, ----统计开始日期
@dt_end datetime)----统计结束日期
RETURNS int ----返回相差天数
AS
BEGIN
/**//*------@workday,工作日;@bz,作开始和结束日期的大小标志位;@dt,作为交换两日期的变量;-----*/
DECLARE @workday int,@i int,@bz bit,@dt datetime
IF @dt_begin>@dt_end ----开始日期大于结束日期,二者交换,且FU值各变量
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, -- 加1包括本天 @workday=@i/7*5,----取出经历多少工作日,以5天计(记住,若是整周倍数,进入下面CIRLCE) ---------------------------------------------------------- ----这一句特别重要,理解这一句,很重要,给@dt_begin从2006-9-29进入CIRLCE
@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 ----判断开始日期在1:5内
THEN @workday+1
ELSE @workday END,
@dt_begin=@dt_begin+1 ---+1,然后WHILE
END
RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)---返回值判断 END
GO
注:1,@dt_begin的灵活运用,非常妙,
2,这个CIRLCE语句非常的好,学习,以后也要这么用,
3,RETURN语句中的CASE,开了眼界
4,谢谢邹大哥,写这么优秀的算法,
CREATE FUNCTION f_WorkDateDiff
( @dt_begin datetime, ----统计开始日期
@dt_end datetime)----统计结束日期
RETURNS int ----返回相差天数
AS
BEGIN
/**//*------@workday,工作日;@bz,作开始和结束日期的大小标志位;@dt,作为交换两日期的变量;-----*/
DECLARE @workday int,@i int,@bz bit,@dt datetime
IF @dt_begin>@dt_end ----开始日期大于结束日期,二者交换,且FU值各变量
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, -- 加1包括本天 @workday=@i/7*5,----取出经历多少工作日,以5天计(记住,若是整周倍数,进入下面CIRLCE) ---------------------------------------------------------- ----这一句特别重要,理解这一句,很重要,给@dt_begin从2006-9-29进入CIRLCE
@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 ----判断开始日期在1:5内
THEN @workday+1
ELSE @workday END,
@dt_begin=@dt_begin+1 ---+1,然后WHILE
END
RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)---返回值判断 END
GO
注:1,@dt_begin的灵活运用,非常妙,
2,这个CIRLCE语句非常的好,学习,以后也要这么用,
3,RETURN语句中的CASE,开了眼界
4,谢谢邹大哥,写这么优秀的算法,
- 分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日)
- 编写SQL Server函数统计两日期间的工作日天数
- 两日期间的工作日分钟数(只排除了周六周日)
- java 求两个日期间的工作日(无周六日)
- oracle 取两个日期间的工作日(无周六日)
- 实习过程学习(3):计算两个日期间间隔的工作日
- sql如何计算两个日期间的工作日,剔除节假日
- js中 计算两个日期间的工作日
- 计算给定两个日期间工作日
- Oracle plsql 计算日期间工作日天数
- javascript 计算两日期间的天数
- SQL 统计工作日 不含周六日
- oracle 获取俩个日期间的工作日
- 怎样用javascript计算两日期间相差的天数.
- Java获取并输出两日期间的所有日期 .
- 求解任意两日期间相隔的天数
- 获取日期之间的工作日(除去周六、日)
- 日期间的天数
- 享受双核,享受高清
- 长假当前
- 尘封防SQL注入 V1.0
- 调整JVM GC ( v1.3.1)
- datawindow.net 连接ODBC数据库
- 分析邹健大哥的算法,终于问题解决了!!!(关于统计两日期间工作日)
- linux淘来的东西持续更新
- 简单谈基于SQL SERVER 分页存储过程的演进
- 高效分页的相关存储过程
- 实现千万级数据分页的存储过程!
- 一条SQL语句搞定Sql Server 2000 分页
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
- 收藏.Delphi.建议使用的语句
- 收藏.Delphi.编码规范