/**//*--调用示例 --查询工作日 SELECT * FROM dbo.f_getdate1('2005-1-3','2005-4-5',0) --查询休息日 SELECT * FROM dbo.f_getdate1('2005-1-3','2005-4-5',1) --查询全部日期 SELECT * FROM dbo.f_getdate1('2006-1-1','2006-12-1',null) --*/ ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_getdate]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_getdate] GO CREATEFUNCTION dbo.f_getdate1( @begin_dateDatetime, --要查询的开始日期 @end_dateDatetime, --要查询的结束日期 @bzbit--@bz=0 查询工作日,@bz=1 查询休息日,@bz IS NULL 查询全部日期 )RETURNS@reTABLE(id intidentity(1,1),Date datetime,Weekday nvarchar(3)) AS BEGIN DECLARE@tbTABLE(ID intIDENTITY(0,1),a bit) INSERTINTO@tb(a) SELECTTOP3660 FROM sysobjects a ,sysobjects b IF@bz=0 WHILE@begin_date<=@end_date BEGIN INSERTINTO@re(Date,Weekday) SELECT Date,DATENAME(Weekday,Date) FROM( SELECT Date=DATEADD(Day,ID,@begin_date) FROM@tb )a WHERE Date<=@end_date AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7BETWEEN1AND5 SET@begin_date=DATEADD(Day,366,@begin_date) END ELSEIF@bz=1 WHILE@begin_date<=@end_date BEGIN INSERTINTO@re(Date,Weekday) SELECT Date,DATENAME(Weekday,Date) FROM( SELECT Date=DATEADD(Day,ID,@begin_date) FROM@tb )a WHERE Date<=@end_date AND (DATEPART(Weekday,Date)+@@DATEFIRST-1)%7in(0,6) SET@begin_date=DATEADD(Day,366,@begin_date) END ELSE WHILE@begin_date<=@end_date BEGIN INSERTINTO@re(Date,Weekday) SELECT Date,DATENAME(Weekday,Date) FROM( SELECT Date=DATEADD(Day,ID,@begin_date) FROM@tb )a WHERE Date<=@end_date SET@begin_date=DATEADD(Day,366,@begin_date) END RETURN END GO SELECT*FROM dbo.f_getdate1('2006-1-1','2006-12-1',1)