server实现自定义分割月功能

本文目录列表:

1、为啥现身自定义分割月供给

2、sql
server达成自定义分割月功能

3、测量试验评释功用

4、总结语

5、参谋项目清单列表

 

1、为啥现身自定义分割月的供给

 

昨日梳理一个平台的具有函数时,发掘了叁个自定义分割月函数,也正是点名分割月的开首日索引值(可以从1-31闭区间内的此外多个值卡塔 尔(阿拉伯语:قطر‎来博取钦定日期所对应的分割月数值。那些函数此时是为了消除业务部门获取非规范月(标准月正是从各种月的率后天到最终一天整合三个完了的规范月份卡塔尔国的总括汇总量据的。举例:若是钦命分割月的始发日索引值为5则意味着有个别月的5号到后一个月的4号之间作为三个完全的分割月;相符地假若钦定分割月的发端日索引值为1则象征规范月等等。

 

小编留意梳头了那个函数实行了重构简化以至扩张,该自定义分割月函数的达成分裂以前写的SQL Server时间粒度类别—-首节旬、月时间粒度安详严整随笔上校三个整数值和月份日期互相转变职能,这么些是据守标准月来完成的,尽管思路大约相符,但是并从未指向事先的月份日期和整数值转变函数对来开展扩张而是独立开垦新的效果函数。也是为着尽量做到函数功用任务单豆蔻年华性、稳固性、可维护性以致可扩张性。

 

2、sql server达成自定义分割月成效

 

自定义分割月效果函数包含七个标量函数:ufn_SegMonths和ufn_SegMonth2Date。ufn_SegMonths获取钦命的日子在自定义分割月对应的分割月数值;ufn_SegMonth2Date获取钦赐三个分割月数值赌对应的月度日期。

 

sql server 版本的贯彻T-SQL代码如下:

IF OBJECT_ID(N'[dbo].[ufn_SegMonths]', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[ufn_SegMonths];
END
GO

--==================================
-- 功能:根据自定义月开始索引值获取指定日期所在的自定义月数。
-- 说明:自定义分割月数 = 年整数值*100 + 当前所在分割月值。
-- 环境:SQL Server 2005+。
-- 调用:SET @intSegMonths = dbo.fn_SegMonths('2008-01-14', 15)。
-- 创建:XXXX-XX-XX XX:XX-XX:XX XXX 创建函数实现。 
-- 修改:XXXX-XX-XX XX:XX-XX:XX XXX XXXXXXXX。
--==================================
CREATE FUNCTION [dbo].[ufn_SegMonths]
(
     @dtmDate AS DATETIME                        -- 日期
    ,@tntSegStartIndexOfMonth AS INT = 15        -- 自定义分割月开始索引值(1-31)
)
RETURNS INT
AS
BEGIN    
    IF (@tntSegStartIndexOfMonth = 0 OR @tntSegStartIndexOfMonth >= 32)
    BEGIN
        SET @tntSegStartIndexOfMonth = 15;
    END

    DECLARE 
         @intYears AS INT
        ,@tntMonth AS TINYINT
        ,@sntDay AS SMALLINT;        
    SELECT 
         @intYears = DATEDIFF(YEAR, '1900-01-01', @dtmDate)
        ,@tntMonth = DATEPART(MONTH, @dtmDate)
        ,@sntDay = DATEPART(DAY, @dtmDate);

    IF (@sntDay >= @tntSegStartIndexOfMonth)
    BEGIN
        SET @tntMonth = @tntMonth + 1;    
    END

    IF (@tntMonth > 12)
    BEGIN
        SELECT
             @intYears = @intYears + 1
            ,@tntMonth = @tntMonth - 12;
    END

    RETURN @intYears * 100 + @tntMonth;
END
GO

IF OBJECT_ID(N'[dbo].[ufn_SegMonths2Date]', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[ufn_SegMonths2Date];
END
GO

--==================================
-- 功能:获取自定义分割月数对应的自定义分割月日期。
-- 说明:自定义分割月日期 = 自定义分割月数/100对应的年整数日期“组合”当前所在分割月值。
-- 环境:SQL Server 2005+。
-- 调用:SET @dtmSegMonthDate = dbo.fn_SegMonths2Date(11602)。
-- 创建:XXXX-XX-XX XX:XX-XX:XX XXX 创建函数实现。 
-- 修改:XXXX-XX-XX XX:XX-XX:XX XXX XXXXXXXX。;
--==================================
CREATE FUNCTION [dbo].[ufn_SegMonths2Date]
(
     @intSegMonths AS INT                        -- 自定义分割月数
)
RETURNS DATETIME
AS
BEGIN        
    DECLARE @dtmDefaultBasedate AS DATETIME;
    SET @dtmDefaultBasedate = '1900-01-01';

    IF ((@intSegMonths IS NULL) OR (@intSegMonths <= 0))
    BEGIN
        RETURN @dtmDefaultBasedate;
    END

    DECLARE 
         @intYears AS INT
        ,@intMonth AS INT;    
    SELECT 
         @intYears = @intSegMonths / 100
        ,@intMonth = @intSegMonths % 100;    

    RETURN DATEADD(MONTH, @intMonth - 1, DATEADD(YEAR, @intYears, @dtmDefaultBasedate));
END
GO

 

3、测量检验注解功能

 

针对上述轻巧的测量试验代码如下:

DECLARE 
     @dtmStartDate AS DATETIME
    ,@dtmEndDate AS DATETIME;

SELECT
     @dtmStartDate = '2000-01-01'
    ,@dtmEndDate = '2016-12-31';

SELECT 
    [T1].*
    ,[dbo].[ufn_SegMonths2Date]([T1].[SegMonths]) AS SegMonthDate
FROM (
    SELECT 
        [T].[CDate]
        ,[dbo].[ufn_SegMonths]([T].[CDate], 28) AS SegMonths

    FROM (
        SELECT 
            DATEADD(DAY, [Num], @dtmStartDate) AS CDate
        FROM 
            [dbo].[ufn_GetNums](0, DATEDIFF(DAY, @dtmStartDate, @dtmEndDate))
    ) AS T
    WHERE [T].[CDate] BETWEEN '2014-12-01' AND '2016-03-31'
) AS T1
WHERE DATEPART(DAY, [T1].[CDate]) >= 27
GO

作用截图如下:

www.350.vip 1

www.350.vip 2

 

注意:以上测量检验代码使用了SQL
Server数字协助表的完毕那边文章的内联表值函数ufn_GetNums。

 

4、总结语

 

此番是梳理平台的功用性函数所进行的重构简化以致扩展的落实。尽量将日期有关的意义函数梳理出来,便于直接在sql
server客商数据库中来选用,
也会有扶持BI仓库中应用。国庆一来已经葬身鱼腹一周,原本筹算一周一回的陈设依旧延期啦,再一次严重检讨自身。

www.350.vip , 

接二连三精进SQL Server,继续上前。

 

5、仿效清单列表

  • SQL Server数字支持表的兑现

  • SQL Server时间粒度类别—-首节旬、月时间粒度详整 

发表评论

电子邮件地址不会被公开。 必填项已用*标注