--
用于统计指定日期范围内, 星期天到星期六的个数列表
IF
EXISTS
(
SELECT
*
FROM
dbo.sysobjects
WHERE
id
=
OBJECT_ID
(N
'
[dbo].[usp_GetWeekDayCount]
'
)
AND
OBJECTPROPERTY
(id, N
'
IsProcedure
'
)
=
1
)
DROP
PROC
[
dbo
]
.
[
usp_GetWeekDayCount
]
GO
CREATE
PROC
[
dbo
]
.
[
usp_GetWeekDayCount
]
@BeginDate
DATETIME
,
@EndDate
DATETIME
AS
SET
NOCOUNT
ON
;
DECLARE
@WeekDay
TABLE
(
[
Index
]
TINYINT
NOT
NULL
PRIMARY
KEY
,
[
Name
]
NVARCHAR
(
20
)
NOT
NULL
,
[
Count
]
INT
);
DECLARE
@DateFirst
DATETIME
,
@DateLast
DATETIME
;
SELECT
@DateFirst
=
DATEADD
(week,
DATEDIFF
(week,
0
,
GETDATE
()),
0
) ,
@DateLast
=
DATEADD
(week,
DATEDIFF
(week,
0
,
GETDATE
())
+
1
,
0
);
WHILE
@DateFirst
<
@DateLast
BEGIN
INSERT
INTO
@WeekDay
(
[
Index
]
,
[
Name
]
,
[
Count
]
)
VALUES
(
DATEPART
(weekday,
@DateFirst
),
DATENAME
(weekday,
@DateFirst
),
0
);
SET
@DateFirst
=
DATEADD
(
day
,
1
,
@DateFirst
);
END
;
SELECT
@DateFirst
=
DATEADD
(week,
DATEDIFF
(week,
0
,
@BeginDate
)
+
1
,
0
) ,
@DateLast
=
DATEADD
(week,
DATEDIFF
(week,
0
,
@EndDate
),
0
);
IF
@DateLast
<
@DateFirst
UPDATE
@WeekDay
SET
[
Count
]
=
[
Count
]
+
1
WHERE
[
Index
]
>=
DATEPART
(weekday,
@BeginDate
)
AND
[
Index
]
<=
DATEPART
(weekday,
@EndDate
);
ELSE
BEGIN
UPDATE
@WeekDay
SET
[
Count
]
=
[
Count
]
+
DATEDIFF
(
day
,
@DateFirst
,
@DateLast
)
/
7
;
UPDATE
@WeekDay
SET
[
Count
]
=
[
Count
]
+
1
WHERE
[
Index
]
>=
DATEPART
(weekday,
@BeginDate
);
UPDATE
@WeekDay
SET
[
Count
]
=
[
Count
]
+
1
WHERE
[
Index
]
<=
DATEPART
(weekday,
@EndDate
);
END
;
--
与.NET星期索引统一(0-6)
UPDATE
@WeekDay
SET
[
Index
]
=
[
Index
]
-
1
;
SELECT
*
FROM
@WeekDay
;
SET
NOCOUNT
OFF
;
GO
调用示例:
EXEC
usp_GetWeekDayCount
'
2007-04-01
'
,
'
2007-04-30
'
结果: Index Name Count ----- -------------------- ----------- 0 Sunday 5 1 Monday 5 2 Tuesday 4 3 Wednesday 4 4 Thursday 4 5 Friday 4 6 Saturday 4