【原创】分享一篇统计月份内的天数,工作天数、假日天数的脚本

分享一篇日期数据脚本,主要统计出给定月份内的天数,工作天数、假日天数。

--********************************************
--
本SQL文件生成指定年份的月份日期数据,
--
包括月份的天数、工作天数、假日天数
--
作者:TangQS
--
日期:2012-03-28
--
Microsoft SQL Server 2005
--
********************************************
if Object_id('MonthData') is not Null
drop table MonthData;
GO

CREATE TABLE [dbo].[MonthData](
[F_Month] [datetime] primary key,
[F_DayCount] [smallint] NULL,
[F_WorkDay] [smallint] NULL,
[F_Holidays] [smallint] NULL,
[F_Remark] [nvarchar](2000)
);
GO

declare @mS datetime, @mE datetime, @YearEnd datetime;
declare @W1 int, @D1 int;
declare @W2 int, @D2 int;
declare @DayCount int, @WorkDay int, @Holidays int;
set @mS = '1990-01-01'; --开始年份
set @YearEnd = '2030-12-01' --结束年份

while @mS <= @YearEnd
begin
  set @mE = dateadd(dd, -1, dateadd(mm, 1, @mS));
  set @W1 = datepart(week, @mS);
  set @D1 = datepart(weekday, @mS);
  set @W2 = datepart(week, @mE);
  set @D2 = datepart(weekday, @mE);
  set @DayCount = datediff(dd, @mS, @mE) +1;
  set @WorkDay = (@W2 - @W1 -1)*5 + (CASE @D1 WHEN 1 THEN 5 ELSE 7 - @D1 END) + (CASE @D2 WHEN 7 THEN 5 ELSE @D2 - 1 END);
  set @Holidays = (@W2 - @W1 -1)*2 + (CASE @D1 WHEN 1 THEN 2 ELSE 1 END) + (CASE @D2 WHEN 7 THEN 2 ELSE 1 END);
  insert into MonthData([F_Month], [F_DayCount], [F_WorkDay], [F_Holidays])
  select @mS as month, @DayCount as DayCount, @WorkDay AS WorkDay, @Holidays AS Holidays;
  set @mS = dateadd(mm, 1, @mS);
end;
GO

/*

F_Month F_DayCount F_WorkDay F_Holidays F_Remark
----------------------- ---------- --------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2012-01-01 00:00:00.000 31 22 9 NULL
2012-02-01 00:00:00.000 29 21 8 NULL
2012-03-01 00:00:00.000 31 22 9 NULL
2012-04-01 00:00:00.000 30 21 9 NULL
2012-05-01 00:00:00.000 31 23 8 NULL
2012-06-01 00:00:00.000 30 21 9 NULL
2012-07-01 00:00:00.000 31 22 9 NULL
2012-08-01 00:00:00.000 31 23 8 NULL
2012-09-01 00:00:00.000 30 20 10 NULL
2012-10-01 00:00:00.000 31 23 8 NULL
2012-11-01 00:00:00.000 30 22 8 NULL
2012-12-01 00:00:00.000 31 21 10 NULL

*/



posted on 2012-03-29 08:11  唐朝t  阅读(436)  评论(0编辑  收藏  举报