直接上代碼:spa
--獲取往前推的N個半年度 CREATE FUNCTION F3_GetRecentNHalfYear ( @N INT ) RETURNS @Result TABLE ( Year SMALLINT, HalfYear TINYINT, DateName VARCHAR(200) ) AS BEGIN IF @N <1 BEGIN RETURN END DECLARE @Now DATETIME, @StartHalfYear TINYINT, --從上半年仍是下半年開始 @I INT SET @Now = GETDATE() SET @I = 1 IF(MONTH(@Now)<=6) SET @StartHalfYear = 1 ELSE SET @StartHalfYear = 2 WHILE @I <= @N BEGIN --若是當前是上半年,那麼就是從1開始的,最近的N個年度是這樣的: 2015 2014 2014 2013 2013 2012 --而它們與當前日期@Now呈現這樣的數列: -0, -1, -0, -1, -0, -1 ..... --若是當前是下半年,那麼就是從2開始的,最近的N個年度是這樣的: 2015 2015 2014 2014 2013 2013 2012 --而它們與當前日期@Now呈現這樣的數列: -0, -0, -1, -0, -1, -0,..... IF @StartHalfYear = 2 BEGIN IF @I >2 AND @I % 2 != 0 BEGIN SET @Now = DATEADD(yyyy,-1,@Now) END END ELSE BEGIN IF @I % 2 = 0 BEGIN SET @Now = DATEADD(yyyy,-1,@Now) END END --若是當前是上半年,那麼就是從1開始的,最近的N個半年度呈現這樣的數列: 1 2 1 2 1 2 1 2 --若是當前是下半年,那麼就是從2開始的,最近的N個半年度呈現這樣的數列: 2 1 2 1 2 1 2 1 --那麼通項公式分別是:(3+POWER(-1,@I))/2 和 (3+POWER(-1,@I+1))/2 INSERT INTO @Result (Year,HalfYear) SELECT YEAR(@Now),(3+POWER(-1,@I+(@StartHalfYear-1)))/2 SET @I = @I + 1 END UPDATE @Result SET DateName = CAST(Year AS VARCHAR(4))+'年' + ( CASE WHEN HalfYear=1 THEN '上半年' ELSE '下半年' END ) RETURN END