具體示例如下:
declare @i int-----------------------------計數器
declare @curWk int-------------------------指定日期在該年的周數
declare @fstWk int-------------------------每月一號在該年的周數
declare @fstDay nvarchar(10)---------------每月的第一天
declare @lstDay nvarchar(10)---------------每月的最後一天
declare @tmpDay smalldatetime--------------每周日的日期
declare @date smalldatetime----------------指定的日期
declare @tmpDay1 smalldatetime-------------每周六的日期
set @date = '2007-9-1'
select @fstDay=(cast(year(@date) as nvarchar(4))+'-'+ cast(month(@date) as nvarchar(2))+'-'+'1')
set @fstDay = Convert(nvarchar(10),cast(@fstDay as smalldatetime),120)
--print '本月第一天:'+@fstDay
set @fstWk = datepart(wk,@fstDay)
--print '本月第一周:'+str(@fstWk)
set @lstDay = Convert(nvarchar(10),dateadd(d,-1,dateadd(m,1,@fstDay)),120)
--print '本月最後一周:'+@lstDay
set @i=0
----找出跟上個月同一周的日期
while(@i<8)
begin
set @tmpDay = dateadd(dd,@i,@fstDay)
set @curWk = datepart(wk,@tmpDay)
if @curWk>@fstWk
begin
--print @tmpDay
break
end
set @i = @i+1
end
--print '本月第二周:'+convert(nvarchar(10),@tmpDay,120)
set @i=1
----找出這個月的日期
while(@i<7)
begin
if(@i=1)----------------如果是第一周,直接輸出結果
begin
print('第'+str(@i)+'周:'+@fstDay+'--------'+convert(nvarchar(10),DateAdd(d,-1,@tmpDay),120))
set @i=@i+1
end
/**//*
*如果周日的日期還在該月內則繼續下面的循環
**/
if(datediff(d,@tmpDay,@lstDay)>=0)
begin
set @tmpDay1 = DateAdd(d,6,@tmpDay)------周六的日期就是周日的日期加六就可以
/**//*
*如果周六的日期超過該月最後一天,則直接輸出周日跟該月最後一天,否則輸出周日跟周六
**/
if(DateDiff(d,@lstDay,@tmpDay1)>0)--超過該月最後一天,則直接輸出周日跟該月最後一天
begin
print('第'+str(@i)+'周:'+Convert(nvarchar(10),@tmpDay,120)+'--------'+convert(nvarchar(10),@lstDay,120))
end
else--輸出周日跟周六
print('第'+str(@i)+'周:'+Convert(nvarchar(10),@tmpDay,120)+'--------'+convert(nvarchar(10),@tmpDay1,120))
end
set @tmpDay=DateAdd(d,7,@tmpDay)----算出下周日的日期
if (datediff(d,@tmpDay,@lstDay)<0)--如果周日的日期超過該月的最後一天,則退出循環
break
set @i=@i+1
end