SQL中获取最近的N个半年度

直接上代码:

复制代码
--获取往前推的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 
复制代码

 

posted @   mcjeremy  阅读(1109)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
------------------------------------ 心静似高山流水不动,心清若巫峰雾气不沾 ------------------------------------
点击右上角即可分享
微信分享提示