--以下示例演示了在不同的语言环境(SET LANGUAGE)下,DATENAME与CONVERT函数的不同结果。 USE master --设置会话的语言环境为: English SET LANGUAGE N'English' SELECT DATENAME(Month,GETDATE()) AS[Month], DATENAME(Weekday,GETDATE()) AS[Weekday], CONVERT(varchar,GETDATE(),109) AS[CONVERT]
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
10、工作日处理函数(标准节假日)
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_WorkDay]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_WorkDay] GO --计算两个日期相差的工作天数 CREATEFUNCTION f_WorkDay( @dt_begindatetime, --计算的开始日期 @dt_enddatetime--计算的结束日期 )RETURNSint AS BEGIN DECLARE@workdayint,@iint,@bzbit,@dtdatetime IF@dt_begin>@dt_end SELECT@bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt ELSE SET@bz=0 SELECT@i=DATEDIFF(Day,@dt_begin,@dt_end)+1, @workday=@i/7*5, @dt_begin=DATEADD(Day,@i/7*7,@dt_begin) WHILE@dt_begin<=@dt_end BEGIN SELECT@workday=CASE WHEN (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7BETWEEN1AND5 THEN@workday+1ELSE@workdayEND, @dt_begin=@dt_begin+1 END RETURN(CASEWHEN@bz=1THEN-@workdayELSE@workdayEND) END GO
11、工作日处理函数(自定义节假日)
ifexists (select*from dbo.sysobjects where id =object_id(N'[tb_Holiday]') andOBJECTPROPERTY(id, N'IsUserTable') =1) droptable[tb_Holiday] GO --定义节假日表 CREATETABLE tb_Holiday( HDate smalldatetimeprimarykeyclustered, --节假日期 Name nvarchar(50) notnull) --假日名称 GO ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_WorkDay]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_WorkDay] GO --计算两个日期之间的工作天数 CREATEFUNCTION f_WorkDay( @dt_begindatetime, --计算的开始日期 @dt_enddatetime--计算的结束日期 )RETURNSint AS BEGIN IF@dt_begin>@dt_end RETURN(DATEDIFF(Day,@dt_begin,@dt_end) +1-( SELECTCOUNT(*) FROM tb_Holiday WHERE HDate BETWEEN@dt_beginAND@dt_end)) RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin) +1-( SELECTCOUNT(*) FROM tb_Holiday WHERE HDate BETWEEN@dt_endAND@dt_begin))) END GO ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_WorkDayADD]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_WorkDayADD] GO --在指定日期上增加工作天数 CREATEFUNCTION f_WorkDayADD( @datedatetime, --基础日期 @workdayint--要增加的工作日数 )RETURNSdatetime AS BEGIN IF@workday>0 WHILE@workday>0 SELECT@date=@date+@workday,@workday=count(*) FROM tb_Holiday WHERE HDate BETWEEN@dateAND@date+@workday ELSE WHILE@workday<0 SELECT@date=@date+@workday,@workday=-count(*) FROM tb_Holiday WHERE HDate BETWEEN@dateAND@date+@workday RETURN(@date) END
12、计算工作时间的函数
ifexists (select*from dbo.sysobjects where id =object_id(N'[tb_worktime]') andOBJECTPROPERTY(id, N'IsUserTable') =1) droptable[tb_worktime] GO --定义工作时间表 CREATETABLE tb_worktime( ID intidentity(1,1) PRIMARYKEY, --序号 time_start smalldatetime, --工作的开始时间 time_end smalldatetime, --工作的结束时间 worktime ASDATEDIFF(Minute,time_start,time_end) --工作时数(分钟) ) GO ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_WorkTime]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_WorkTime] GO --计算两个日期之间的工作时间 CREATEFUNCTION f_WorkTime( @date_begindatetime, --计算的开始时间 @date_enddatetime--计算的结束时间 )RETURNSint AS BEGIN DECLARE@worktimeint IFDATEDIFF(Day,@date_begin,@date_end)=0 SELECT@worktime=SUM(DATEDIFF(Minute, CASEWHENCONVERT(VARCHAR,@date_begin,108)>time_start THENCONVERT(VARCHAR,@date_begin,108) ELSE time_start END, CASEWHENCONVERT(VARCHAR,@date_end,108)<time_end THENCONVERT(VARCHAR,@date_end,108) ELSE time_end END)) FROM tb_worktime WHERE time_end>CONVERT(VARCHAR,@date_begin,108) AND time_start<CONVERT(VARCHAR,@date_end,108) ELSE SET@worktime =(SELECTSUM(CASE WHENCONVERT(VARCHAR,@date_begin,108)>time_start THENDATEDIFF(Minute,CONVERT(VARCHAR,@date_begin,108),time_end) ELSE worktime END) FROM tb_worktime WHERE time_end>CONVERT(VARCHAR,@date_begin,108)) +(SELECTSUM(CASE WHENCONVERT(VARCHAR,@date_end,108)<time_end THENDATEDIFF(Minute,time_start,CONVERT(VARCHAR,@date_end,108)) ELSE worktime END) FROM tb_worktime WHERE time_start<CONVERT(VARCHAR,@date_end,108)) +CASE WHENDATEDIFF(Day,@date_begin,@date_end)>1 THEN (DATEDIFF(Day,@date_begin,@date_end)-1) *(SELECTSUM(worktime) FROM tb_worktime) ELSE0END RETURN(@worktime) END
13、复杂年月处理
--定义基本数字表 declare@T1table(代码 int,名称 varchar(10),参加时间 datetime,终止时间 datetime) insertinto@T1 select12,'单位1','2003/04/01','2004/05/01' unionallselect22,'单位2','2001/02/01','2003/02/01' unionallselect42,'单位3','2000/04/01','2003/05/01' unionallselect25,'单位5','2003/04/01','2003/05/01' --定义年表 declare@NBtable(代码 int,名称 varchar(10),年份 int) insertinto@NB select12,'单位1',2003 unionallselect12,'单位1',2004 unionallselect22,'单位2',2001 unionallselect22,'单位2',2002 unionallselect22,'单位2',2003 --定义月表 declare@YBtable(代码 int,名称 varchar(10),年份 int,月份 varchar(2)) insertinto@YB select12,'单位1',2003,'04' unionallselect22,'单位2',2001,'01' unionallselect22,'单位2',2001,'12' --为年表+月表数据处理准备临时表 selecttop8246 y=identity(int,1753,1) into #tby from (select id from syscolumns) a, (select id from syscolumns) b, (select id from syscolumns) c --为月表数据处理准备临时表 selecttop12 m=identity(int,1,1) into #tbm from syscolumns #tby,#tbm
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_weekdaycount]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_weekdaycount] GO
16、任意两个时间之间的星期几的次数-纵
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_weekdaycount]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_weekdaycount] GO