GO /**//****** 对象: UserDefinedFunction [dbo].[LoopTime] 脚本日期: 09/19/2007 15:37:20 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: WGF2006 -- Create date: 2007-9-19 -- Description: 将时间转换为按年 季 月 旬 周 日的行集 -- Parameters: @STime开始时间 @ETime结束时间 @Type格式化的类型。Y年 Q季 M月 T旬 W周 D日 -- ============================================= CREATEFUNCTION[dbo].[LoopTime] ( -- Add the parameters for the function here @STimedatetime, @ETimedatetime, @TypeVARCHAR(2) ) RETURNS@RetTableTABLE(ID INTIDENTITY(1,1),TimeName VARCHAR(50)) AS BEGIN DECLARE@Timedatetime SET@Time=@STime WHILE(@Time<@ETime) BEGIN INSERTINTO@RetTable(TimeName) VALUES(dbo.FormatTime(@Time,@Type)) SELECT@Time=CASE@TypeWHEN'Y'THENDATEADD(YY,1,@Time) WHEN'Y'THENDATEADD(YY,1,@Time) WHEN'Q'THENDATEADD(Q,1,@Time) WHEN'M'THENDATEADD(M,1,@Time) WHEN'T'THEN[dbo].DATEADDXUN(@Time) WHEN'W'THENDATEADD(WK,1,@Time) ELSEDATEADD(D,1,@Time) end END RETURN END
以下函数完成添加一旬的功能
USE[MainData] GO /**//****** 对象: UserDefinedFunction [dbo].[DATEADDXUN] 脚本日期: 09/19/2007 15:37:52 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATEFUNCTION[dbo].[DateAddXUN] ( @STimedatetime ) RETURNSdatetime AS BEGIN DECLARE@DTdatetime IF(DATEPART(D,@STime)>20) BEGIN --处理下旬 IF(DATEPART(M,@STime) IN (1,3,5,7,8,10,12)) SET@DT=DATEADD(D,11,@STime) ELSEIF(DATEPART(M,@STime)=2) SET@DT=DATEADD(D,8,@STime) ELSE SET@DT=DATEADD(D,10,@STime) END ELSE SET@DT=DATEADD(D,10,@STime) RETURN@DT END
以下函数完成日期的
GO /**//****** 对象: UserDefinedFunction [dbo].[FormatTime] 脚本日期: 09/19/2007 15:38:41 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: WGF2006 -- Create date: 2007-9-19 -- Description: ''将时间格式化成 年 季 月 旬 周 日方便用来汇总 -- Parameters: @DateTime进行格式的时间变量 @Type格式化的类型。Y年 Q季 M月 T旬 W周 D日 -- ============================================= CREATEFUNCTION[dbo].[FormatTime] ( @DateTimedatetime, @Typevarchar(2) ) RETURNSvarchar(50) AS begin Declare@strvarchar(50) Declare@dayint IF(@Type='y') --格式化成年 select@str=Convert(Varchar(4),@DateTime,120) elseIF(@Type='q') --格式化成季度 select@str=Convert(Varchar(4),datepart(YY, @DateTime))+'-'+Convert(Varchar(4),datepart(quarter, @DateTime))+'季度' elseIF(@Type='m') --格式化成月 select@str=Convert(Varchar(7),@DateTime,120) elseIF(@Type='t') begin --格式化成旬 set@day=datepart(d, @DateTime) select@str=Convert(Varchar(7),@DateTime,120)+'月'+case when@daybetween1and10then '上旬' when@daybetween11and20then '中旬' else '下旬' end end elseIF(@Type='w') --格式化成周 select@str=Convert(Varchar(4),@DateTime,120)+'-第'+Convert(varchar(2),datepart(wk,@DateTime))+'周 ' else --格式化成年月日 select@str=Convert(Varchar(10),@DateTime,120) return@str end
实现汇总的测试
SELECT B.Bmoney, B.Total ,dbo.FormatTime(TellerTime,'t') AS tn INTO #t FROM CW_ORDER A Join Cw_OrderDetail B ON A.ID=B.OrderID WHERE TellerTime between '2007-1-1' and'2007-8-31' and A.state>3 and A.ISDel=0 select Sum(BMoney) BMoney ,Sum(Total)Total ,tn into #B From #T Group by tn SELECT * FROM dbo.LoopTime ('2007-1-1','2007-8-31','t') A left JOIN #B B ON A.TimeName= B.Tn order by B.Bmoney desc drop table #B drop table #t