在SQL 2005&SQL2008实现这一功能,首先要了解在MSSQL,一年中周的描述。

图1
1.周的第一天,在MSSQL中,可以通过下面的值来描述周的第一天:

美国英语中默认7为一周中的第一天。
通过@@Datefirst函数获取当前周的第一天:
Select
@@Datefirst
As
[
周的第一天
]
2. 2011-01-01所在的周
Select
'
2010-12-31
'
AS
[
日期
]
,
Datepart
(week,
'
20101231
'
)
As
[
周
]
Union
All
Select
'
2011-01-01
'
,
Datepart
(week,
'
20110101
'
)
Union
All
Select
'
2011-01-02
'
,
Datepart
(week,
'
20110102
'
)
Union
All
Select
'
2011-01-03
'
,
Datepart
(week,
'
20110103
'
)

从这里可以看出,2011-01-01是属于2011年的第1周,2011-01-02就是第2周了 。
了解完上面两点内容描述,回到题目问题,这里取个案例,如要找第16周的周六日对应的日期,
3.按日历图找出第16周
Select
Dateadd
(week,
16
-
1
,
'
20110101
'
)
[
2011-01-01过15周后对应的日期
]

这里可以看出第16周,是从2011-04-10至2011-04-16,周六日日期是2011-04-1 & 2011-04-16
4.找出周六日出现在日历图中的规律
为了更能简洁的说明,周六日在日历图(1-7位置)出现的规律,这里特别制作一些图形来描述:

接下来,就周六日出现的位置,进行分析:
从上面的图,可以简单分析出下面的算式:

从上面周六、周日位置的变化,可以观察出,无论如何,周六日位置都是在N1-N7之间,
当周的第一天为7,周六的位置变成了N7.这里可以假设,当@@Datefirst=7,周六的等式:
N1(D)+x+(6-7)=N1(D)+6 //x表示未知,N1(D)+6表示,当@@Datefirst=7,周的第一个日期+6天就等于周六的日期
x+(6-7)=+6
x=7
这里就可以得出,当@@Datefirst=7,周六的算式:N1(D)+7+(6-7)
分析周六日的算式,可以得出,
周六:If 6>=@@Datefirst Then N1(D)+0+(6-@@Datefirst) Else N1(D)+7+(6-@@Datefirs)
周日:If 7>=@@Datefirst Then N1(D)+0+(7-@@Datefirst) Else N1(D)+7+(7-@@Datefirs)
为了更能说明变化的规律,再看看下面周四的情况:

这里周四的位置变化,如倾斜的"N"字母,套用前面的算式可以得到:
好了,接下来,很容易根据一年中的第几周,查询出它周六和周日对应的日期了
Declare
@Week
smallint
,
@Date
datetime
Set
datefirst
7
/*
设置周的第一天
*/
Set
@Week
=
16
/*
第几周
*/
Set
@Date
=
Dateadd
(week,
@Week
-
1
,
rtrim
(
year
(
getdate
()))
+
'
0101
'
)
-
datepart
(dw,
rtrim
(
year
(
getdate
()))
+
'
0101
'
)
+
1
/*
算出第16周的第一个日期
*/
Select
@Week
As
[
周
]
,
@Date
+
Case
When
6
>=
@@datefirst
Then
6
-
@@datefirst
Else
7
+
(
6
-
@@datefirst
)
End
As
[
星期六
]
,
@Date
+
Case
When
7
>=
@@datefirst
Then
7
-
@@datefirst
Else
7
+
(
7
-
@@datefirst
)
End
As
[
星期日
]
--
-另外一个不用Case的写法:
Select
@Week
As
[
周
]
,
@Date
+
7
*
Sign
(
1
-
Sign
(
6
-
@@datefirst
+
1
))
+
(
6
-
@@datefirst
)
As
[
星期六
]
,
@Date
+
7
*
Sign
(
1
-
Sign
(
7
-
@@datefirst
+
1
))
+
(
7
-
@@datefirst
)
As
[
星期日
]
