CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

sql如何计算两个日期间的工作日,剔除节假日

楼主suaha(武装斗争)2006-03-17 14:43:04 在 MS-SQL Server / 基础类 提问

可以实现么? 问题点数:50、回复次数:6Top

1 楼lcooc(don't make me think)回复于 2006-03-17 14:50:20 得分 0

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  
  GOTop

2 楼viptiger(六嘎)回复于 2006-03-17 14:54:52 得分 0

declare   @day   int  
  SET   DATEFIRST   7  
  set   @day   =   datepart(dw,getdate())  
  if   @day<>1   and   @day<>7  
  begin  
          print   'work   day'  
  endTop

3 楼selectplayer()回复于 2006-03-17 15:14:18 得分 0

如果你所说的节假日不是周立周日的概念,那只有一个办法。建立一张表,包括你会用到的所有日期,标明工作日和节假日,然后count(*)就OK啦。Top

4 楼happyflystone(无枪的狙击手)回复于 2006-03-17 15:19:19 得分 50

-----标准节假日  
   
  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  
   
   
   
  /*=================================================================*/  
   
  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  
   
   
  Top

5 楼happyflystone(无枪的狙击手)回复于 2006-03-17 15:19:50 得分 0

-----自定义节假日  
   
  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  
  Top

6 楼wakinhui(秋风浪萍)回复于 2006-03-17 15:37:00 得分 0

路过,没说的!Top

相关问题

  • 如何计算工作日问题
  • 问一个计算工作日的问题?
  • 如何计算出两个日期之间有多少个工作日?
  • 请大家帮忙看看下面的计算工作日代码错在什么地方
  • SQL计算问题!
  • SQL与差值计算
  • IB.表达式计算.求sql语句
  • sql计算成员的显示问题
  • 求一条SQL分类计算语句
  • SQL怎么计算两个时间差?

关键词

  • date
  • workday
  • dt
  • 计算
  • bz
  • 日期
  • 工作日
  • dbo
  • begin
  • dateadd

得分解答快速导航

  • 帖主:suaha
  • happyflystone

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo