示例效果为:
得到某年内每周的开始日期和结束日期
每周以周日为第一天
一周以至少还有四天为计
如
2004/01/01 是已经周四
那么2004年的第一周从2004/01/04开始
2007/12/31 是周二
那么2007年的最后一周只到2007/12/19开始
那么2008年的第一周从2007/12/30开始
相关代码如下:
————–
1.tWeek表
CREATE
TABLE
[
tWeek
]
(
[
tSeqID
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
[
tYear
]
[
int
]
NULL
,
[
tWeekSeq
]
[
int
]
NULL
,
[
tStartDate
]
[
datetime
]
NULL
,
[
tEndDate
]
[
datetime
]
NULL
,
CONSTRAINT
[
PK_tWeek
]
PRIMARY
KEY
CLUSTERED
(
[
tSeqID
]
)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
GO
2.生成相关数据的SQL语句
DECLARE
@SYear
int
—
开始年份
DECLARE
@EYear
int
—
结束年份
SET
DATEFIRST
7
—
设周日为每周第一天
SET
@SYear
=
2004
SET
@EYear
=
2010
—
周以至少四天为计
—
判断第一周的开始与结束
DECLARE
@YSDate
DATETIME
—
年的第一周开始时间
DECLARE
@YEDate
DATETIME
—
年的最后周结束时间
DECLARE
@WSDate
DATETIME
—
用于循环的年内某周的开始日期
DECLARE
@WEDate
DATETIME
—
用于循环的年内某周的开始日期
DECLARE
@IWeek
int
—
当前周为本年的第几周
WHILE
@SYear
<=
@EYear
BEGIN
—
BEGIN WHILE YEAR
SET
@YSDate
=
CAST
( (
CAST
(
@SYear
AS
VARCHAR
(
4
) )
+
‘
/01/01
‘
)
AS
DATETIME
)
SET
@YEDate
=
CAST
( (
CAST
(
@SYear
AS
VARCHAR
(
4
) )
+
‘
/12/31
‘
)
AS
DATETIME
)
SET
@IWeek
=
1
IF
DATEPART
(DW,
@YSDate
)
>
4
—
第一周已不足4天 从第二周开始算第一周
BEGIN
SET
@YSDate
=
DATEADD
(
DAY
,(
8
–
DATEPART
(DW,
@YSDate
)) ,
@YSDate
)
—
本周开始日期
END
ELSE
—
第一周足4天 从本周日算第一天
BEGIN
SET
@YSDate
=
DATEADD
(
Day
,(
–
(
DATEPART
(DW,
@YSDate
)
–
1
)) ,
@YSDate
)
END
SET
@WSDate
=
@YSDate
SET
@WEDate
=
DATEADD
(
DAY
,
6
,
@WSDate
)
—
本周结束日期
WHILE
DATEDIFF
(
DAY
,
@WSDate
,
@YEDate
)
>=
4
BEGIN
—
执行Insert
INSERT
INTO
tWeek(tYear, tWeekSeq, tStartDate, tEndDate)
VALUES
(
@SYear
,
@IWeek
,
@WSDate
,
@WEDate
)
—
重置参数
SET
@IWeek
=
@IWeek
+
1
SET
@WSDate
=
@WSDate
+
7
SET
@WEDate
=
@WEDate
+
7
END
SET
@SYear
=
@SYear
+
1
END
—
END WHILE YEAR
3.生成的tWeek表内部分数据示例
顺序号 年份 第几周 该周开始日期 该周结束日期
tSeqID tYear tWeekSeq tStartDate tEndDate
1 2004 1 2004-01-04 00:00:00.000 2004-01-10 00:00:00.000
2 2004 2 2004-01-11 00:00:00.000 2004-01-17 00:00:00.000
…
208 2007 52 2007-12-23 00:00:00.000 2007-12-29 00:00:00.000
209 2008 1 2007-12-30 00:00:00.000 2008-01-05 00:00:00.000