每周第一天或第二天以下是me测试的一个功能,拿过来与大家分享一下,哪里不对望提出:
/*
功能: 计算在某一段时间内某周几(如星期一)的所有日期
设计:OK_008
时间:2006-10
*/
DECLARE @Date datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @WeekDay int
DECLARE @i intSET DATEFIRST 7 --设置每周的第一天 
SET @StartDate='2006-01-01' --统计的开始日期
SET @EndDate='2006-12-31' --统计的结束日期
SET @WeekDay=1 --根据实际的@@DATEFIRST而定,一般默认是7,如 @StartDate='2006-01-01'时候, @WeekDay=3表示星期二
SET @i=DATEPART(weekday,@StartDate)
PRINT '每周的第1天设置@@DATEFIRST: '+CAST(@@DATEFIRST AS nvarchar(1))
PRINT '开始日期对应一周的第几天: '+CAST(@i AS nvarchar(1))
IF(@i<=@WeekDay AND @i<7)
SET @i=@WeekDay-@i 
ELSE IF(@i<=@WeekDay AND @i=7)
SET @i=@i-@WeekDay
ELSE
SET @i=@@DATEFIRST-@i+@WeekDaySET @Date=DATEADD(day,@i,@StartDate)
WHILE @Date<=@EndDate 
BEGIN
IF(@StartDate<=@Date) PRINT CONVERT(nvarchar(10),@Date,121)
SET @Date=DATEADD(Week,1,@Date)
END
GO/* ==============运行结果================*/
/*
每周的第1天设置@@DATEFIRST: 7
开始日期对应一周的第几天: 1
2006-01-01
2006-01-08
2006-01-15
2006-01-22
2006-01-29
..........
*/select dateadd(day,x,col),'星期二' from 
(
select cast('2006-1-1' as datetime) as col
)a cross join 
(
SELECT top 365 b8.i+b7.i + b6.i + b5.i + b4.i +b3.i +b2.i + b1.i + b0.i x
FROM(SELECT 0 i UNION ALL SELECT 1) b0
CROSS JOIN(SELECT 0 i UNION ALL SELECT 2) b1
CROSS JOIN(SELECT 0 i UNION ALL SELECT 4) b2
CROSS JOIN(SELECT 0 i UNION ALL SELECT 8) b3
CROSS JOIN(SELECT 0 i UNION ALL SELECT 16) b4
CROSS JOIN(SELECT 0 i UNION ALL SELECT 32) b5
CROSS JOIN(SELECT 0 i UNION ALL SELECT 64) b6
CROSS JOIN(SELECT 0 i UNION ALL SELECT 128) b7
CROSS JOIN(SELECT 0 i UNION ALL SELECT 256) b8
order by 1
)b
where datepart(dw,dateadd(day,x,col))=3 (这个地方改值换取其他日期)2006-01-03 00:00:00.000                                星期二
2006-01-10 00:00:00.000                                星期二
2006-01-17 00:00:00.000                                星期二
2006-01-24 00:00:00.000                                星期二
2006-01-31 00:00:00.000                                星期二