欢迎来到站长教程网!

mssql

当前位置:主页 > 数据库 > mssql >

sql server 自界说支解月成果详解及实现代码

时间:2021-05-05|栏目:mssql|点击:

在最近的项目开拓进程中,碰着了Sql server自动支解月的成果需求,这里在网上整理下资料.      

1、为何呈现自界说支解月的需求

本日梳理一个平台的所有函数时,发明白一个自界说支解月函数,也就是指定支解月的开始日索引值(可以从1-31闭区间内的任何一个值)来获取指定日期所对应的支解月数值。这个函数其时是为了办理业务部分获取非尺度月(尺度月就是从每个月的第一天到最后一天构成一个完成的尺度月份)的统计汇总数据的。譬喻:假如指定支解月的开始日索引值为5则暗示某个月的5号到下个月的4号之间作为一个完整的支解月;同样地假如指定支解月的开始日索引值为1则暗示尺度月等等。 

我仔细梳理了这个函数举办了重构简化以及扩展,该自界说支解月函数的实现区别之前写的SQL Server时间粒度系列----第3节旬、月时间粒度详解文章中将一个整数值和月份日期彼此转换成果,这个是凭据尺度月来实现的,固然思路大抵沟通,可是并没有针对之前的月份日期和整数值转换函数对来举办扩展而是独立开拓新的成果函数。也是为了只管做到函数成果职责单一性、不变性、可维护性以及可扩展性。 

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

结果截图如下:

sql server 自定义分割月成就详解及实现代码

 留意:以上测试代码利用了SQL Server数字帮助表的实现这边文章的内联表值函数ufn_GetNums。

 4、总结语

上一篇:Python版Mssql爆破小剧本

栏    目:mssql

下一篇:SQL Server 实现数字帮助表实例代码

本文标题:sql server 自界说支解月成果详解及实现代码

本文地址:www.jiaocheng88.com.cn/mssql/62000.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:584415406 | 邮箱:584415406#qq.com(#换成@)

Copyright © 2015-2020 小白站长教程网 版权所有 苏ICP备20040415号-3