日期:2014-05-19  浏览次数:20529 次

怎么抓某年某月共有几个周六?在线结贴~~~~
怎么抓某年某月共有几个周六?怎么写函数?

------解决方案--------------------
create proc GetDateNum
@sdate smalldatetime
as
declare @edate smalldatetime

set @edate=dateadd(day,-1,dateadd(month,1,@sdate))
select top 31 id=identity(int,0,1) into # from syscolumns
select count(1) 总数 from (
select dateadd(day,id,@sdate) g,datepart(weekday,dateadd(day,id,@sdate)) a from # where dateadd(day,id,@sdate) <=@edate
)aa where a=7

drop table #
go
exec GetDateNum '2007-06-01 '
------解决方案--------------------
---创建函数
Create Function Fn_Day(@Year varchar(4),@Month varchar(2))
Returns @T table(D datetime)
As
Begin
Declare @i int
Set @i=1
While @i <=31 and isdate(@Year+ '- '+@Month+ '- '+cast(@i as varchar))=1
Begin
Insert @T values(@Year+ '- '+@Month+ '- '+cast(@i as varchar))
Set @i=@i+1
End
Return
End
Go
---查询结果
Select Count(1) As 总共有周六个数
From
dbo.Fn_Day( '2007 ', '8 ')
Where Datepart(weekday,D)=7 --星期六为7
               --星期天为1   
/*
总共有周六个数
-----------
4

(所影响的行数为 1 行)
*/
------解决方案--------------------

declare @date varchar(20)
set @date= '200701 '
set @date=@date+ '01 '


select (datediff(dd,@date,dateadd(mm,1,@date))+DATEPART (dw , @date)-1)/7
------解决方案--------------------
这个邹老大写过了。
if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[f_weekdaycount] ') and xtype in (N 'FN ', N 'IF ', N 'TF '))
drop function [dbo].[f_weekdaycount]
GO

/*--计算任意两个时间之间的星期几的次数(横向显示)

本方法直接判断 @@datefirst 做对应处理
不受 sp_language 及 set datefirst 的影响

--邹建 2004.08(引用请保留此信息)--*/

/*--调用示例

select * from f_weekdaycount( '2004-9-01 ', '2004-9-02 ')
--*/
create function f_weekdaycount(
@dt_begin datetime,
@dt_end datetime
)returns table
as
return(
select 跨周数
,周一=case a
when -1 then case when 1 between b and c then 1 else 0 end
when 0 then case when b <=1 then 1 else 0 end
+case when c> =1 then 1 else 0 end
else a+case when b <=1 then 1 else 0 end
+case when c> =1 then 1 else 0 end
end
,周二=case a
when -1 then case when 2 between b and c then 1 else 0 end
when 0 then case when b <=2 then 1 else 0 end
+case when c> =2 then 1 else 0 end
else a+case when b <=2 then 1 else 0 end
+case when c> =2 then 1 else 0 end
end
,周三=case a
when -1 then case when 3 between b and c then 1 else 0 end
when 0 then case when b <=3 then 1 else 0 end
+case when c> =3 then 1 else 0 end
else a+case when b <=3 then 1 else 0 end
+case when c> =3 then 1 else 0 end
end
,周四=case a
when -1 then case when 4 between b and c then 1 else 0 end
when 0 then case when b <=4 then 1 else 0 end
+case when c> =4 then 1 else 0 end
else a+case when b <=4 then 1 else 0 end
+case when c> =4 then 1 else 0 end
end
,周五=case a
when -1 then case when 5 between b and c then 1 else 0 end
when 0 then case when b <=5 then 1 else 0 end
+case when c> =5 then 1 else 0 en