select sn=identity(int,0,1) into #t from syscolumns
select count(*) from #t 
where datediff(month,cast('2004-04-01' as datetime)+sn,'2004-04-01')=0
   and datepart(weekday,cast('2004-04-01' as datetime)+sn) between 2 and 6

解决方案 »

  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 @dt datetime,@re int,@i int
    if @dt_begin>@dt_end 
    select @dt=@dt_begin
    ,@dt_begin=@dt_end
    ,@dt_end=@dt
    select @i=datediff(day,@dt_begin,@dt_end)+1
    ,@re=@i/7*2
    ,@dt=dateadd(day,@i/7*7-1,@dt_begin)
    while @dt<@dt_end
    select @re=case when datepart(weekday,@dt) in(1,7)
    then @re+1 else @re end
    ,@dt=@dt+1
    return(@i-@re)
    end
    go--调用
    select dbo.f_workday('2004-06-20','2004-06-27')
      

  2.   

    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(
    @年月 varchar(7) --要查询的年月,格式要求:2004-7
    )returns int
    as
    begin
    declare @dt_begin datetime,@dt_end datetime
    select @dt_begin=@年月+'-01'
    ,@dt_end=dateadd(month,1,@dt_begin)-1
    declare @dt datetime,@re int,@i int
    if @dt_begin>@dt_end 
    select @dt=@dt_begin
    ,@dt_begin=@dt_end
    ,@dt_end=@dt
    select @i=datediff(day,@dt_begin,@dt_end)+1
    ,@re=@i/7*2
    ,@dt=dateadd(day,@i/7*7-1,@dt_begin)
    while @dt<@dt_end
    select @re=case when datepart(weekday,@dt) in(1,7)
    then @re+1 else @re end
    ,@dt=@dt+1
    return(@i-@re)
    end
    go--调用
    select dbo.f_workday('2004-07')