WEB开发网
开发学院数据库MSSQL Server SQL数据库中工作日如何计算(方法与测试) 阅读

SQL数据库中工作日如何计算(方法与测试)

 2007-11-11 12:17:07 来源:WEB开发网   
核心提示:--方法一:create function f_workday( @dt_begin datetime,--起始时间 @dt_end datetime --结束时间)returns int as begin declare @dt datetime, @re int, @i int if @dt_begi

--方法一:
create function f_workday
( 
 @dt_begin datetime,--起始时间 
 @dt_end datetime  --结束时间
)returns int 
as 
 begin 
  declare @dt datetime,
  @re int,
  @i int 
  if @dt_begin > @dt_end  
  select @dt = @dt_begin, @dt_begin=@dt_end, @dt_end=@dt
  /* datediff返回跨两个指定日期的日期和时间边界数,示例功能:
    确定在 pubs 数据库中标题发布日期和当前日期间的天数, 
    SELECT DATEDIFF(day, pubdate, getdate()) AS no_of_days FROM titles;
   
    dateadd在向指定日期加上一段时间的基础上,返回新的 datetime 值,示例功能:
    打印出 pubs 数据库中标题的时间结构的列表。此时间结构表示当前发布日期加上 21 天,
    SELECT DATEADD(day, 21, pubdate) AS timeframe FROM titles
    下面是结果集:

   timeframe         
   ---------------------------
   Jul 3 1991 12:00AM     
   Jun 30 1991 12:00AM    
   Jul 21 1991 12:00AM    
   Jul 13 1991 12:00AM    
   Jun 30 1991 12:00AM    
   Jul 9 1991 12:00AM     
   Mar 14 1997  5:09PM    
   Jul 21 1991 12:00AM    
   Jul 3 1994 12:00AM     
   Mar 14 1997  5:09PM    
   Nov 11 1991 12:00AM    
   Jul 6 1991 12:00AM     
   Oct 26 1991 12:00AM    
   Jul 3 1991 12:00AM     
   Jul 3 1991 12:00AM     
   Nov 11 1991 12:00AM    
   Jul 3 1991 12:00AM     
   Jul 3 1991 12:00AM     
  
   (18 row(s) affected)
 
    @@datefirst返回 SET DATEFIRST 参数的当前值,SET DATEFIRST 参数指明所规定的每周第一天:1 对应星期一,2 对应
    星期二,依次类推,用 7 对应星期日,示例功能:
    将每周第一天设为 5 (星期五),并假定当日是星期六。SELECT 语句返回 DATEFIRST 值和当日是此周的第几天,
    SET DATEFIRST 5
   SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today'
  
   下面是结果集。从星期五算起,今天(星期六)是第二天。
  
   1st Day      Today
   ----------------  --------------
   5         2

  datepart返回代表指定日期的指定日期部分的整数,示例功能:
    假设日期是 5 月 29 日。

   SELECT DATEPART(month, GETDATE())
   GO
  
   下面是结果集:
  
   -----------
   5     
  
   (1 row(s) affected)
  */
  select @i = datediff(day, @dt_begin, @dt_end) + 1, @re = @i/7*5, @dt = dateadd(day,@i/7*7,@dt_begin) 
  while  @dt <= @dt_end 
  begin 
  select @re=case when (@@datefirst+datepart(weekday,@dt)-1)%7 in(0,6) then @re else @re+1 end ,@dt=@dt+1 
  end 
  return(@re)
 end 

/*http://blog.cncms.com/
下表列出了 Microsoft® sql server(WINDOWS平台上强大的数据库平台)™ 识别的日期部分和缩写。

日期部分   缩写
year     yy, yyyy
quarter    qq, q
month     mm, m
dayofyear   dy, y
day      dd, d
week     wk, ww
weekday    dw
Hour     hh
minute    mi, n
second    ss, s
millisecond  ms

*/
--方法二:
create function f_workdays
(
 @fromdate datetime,
 @todate datetime
)returns int 
as  
 begin 
  declare @i int 
  set @i = 0 
  while @fromdate <= @todate 
  begin 
  if datepart(Dw, @fromdate)<>1 and datepart(Dw, @fromdate)<>7 
   set @i = @i+1 
   set @fromdate = dateadd(day,1,@fromdate) 
  end 
  return(@i) 
 end 

--测试执行
declare @return int
exec @return =f_workday '2007-4-5','2007-5-5'
select 'aa'= @return

备注:公司的工作日可能会调整,所以要慎重考虑能不能用此类计算工作日的方法

Tags:SQL 数据库 工作日

编辑录入:coldstar [复制链接] [打 印]
赞助商链接