zoukankan      html  css  js  c++  java
  • SQL Server时间粒度系列----第5节小时、分钟时间粒度详解

    本文目录列表:
     
    SQL Server小时时间粒度
        
        这里说的时间粒度是指带有小时时间部分的日期时间,这个日期时间精确度是小时的。提供将带小时的日期时间和整数相互转换的功能,和以前日、周、旬、季、年那样。
     
        实现带小时的日期时间和整数相互转换的功能函数,T-SQL如下:
     1 IF OBJECT_ID(N'dbo.ufn_Hours', 'FN') IS NOT NULL
     2 BEGIN
     3     DROP FUNCTION dbo.ufn_Hours;
     4 END
     5 GO
     6  
     7 --==================================
     8 -- 功能: 获得指定的日期时间基于基准日期的总小时数(一个整数值)
     9 -- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
    10 --       结果值为非负整数,从0开始计数。
    11 -- 作者: XXX
    12 -- 创建: yyyy-MM-dd
    13 -- 修改: yyyy-MM-dd XXX 修改内容描述
    14 -- 调用: SET @intHours = dbo.ufn_Hours('2008-01-14 17:45')  -- 947033
    15 --==================================
    16 CREATE FUNCTION dbo.ufn_Hours 
    17 (
    18     @dtmDate DATETIME
    19 ) RETURNS INT
    20     --$Encode$--
    21 AS
    22 BEGIN
    23     SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate);
    24  
    25     -- datepart参数也可以为hh
    26     RETURN DATEDIFF(HOUR, '1900-01-01', @dtmDate)
    27 END
    28 GO
    29  
    30 IF OBJECT_ID(N'dbo.ufn_Hours2Date', 'FN') IS NOT NULL
    31 BEGIN
    32     DROP FUNCTION dbo.ufn_Hours2Date;
    33 END
    34 GO
    35  
    36 --==================================
    37 -- 功能: 获得一个整数值基于基准日期对应的日期时间
    38 -- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;
    39 --       如果指定的整数值大于“9999-12-31 23:00:00”对应的整数值时,则其值默认设置为“9999-12-31 23:00:00”对应的整数值
    40 --       结果值为从基准日期开始计数的日期
    41 -- 作者: XXX
    42 -- 创建: yyyy-MM-dd
    43 -- 修改: yyyy-MM-dd XXX 修改内容描述
    44 -- 调用: SET @dtmDate = dbo.fn_Hours2Date(947033) -- '2008-01-14 17:00'
    45 --==================================
    46 CREATE FUNCTION dbo.ufn_Hours2Date 
    47 (
    48     @intHours INT
    49 ) RETURNS DATETIME
    50 AS
    51 BEGIN
    52     SET @intHours = dbo.ufn_GetValidDateNum(@intHours);
    53  
    54     DECLARE @intHoursMax AS INT;
    55     SET @intHoursMax = dbo.ufn_Hours('9999-12-31 23:00:00');
    56  
    57     IF @intHours >= @intHoursMax
    58     BEGIN
    59         SET @intHours = @intHoursMax;
    60     END
    61  
    62     -- datepart参数也可以为hh
    63     RETURN DATEADD(hh, @intHours, '1900-01-01')
    64 END
    65 GO
        测试以上功能函数的效果,T-SQL如下:
    1 DECLARE @dtmDate AS DATETIME;
    2 SET @dtmDate = '2008-01-14 17:00:00';
    3  
    4 SELECT @dtmDate AS 'The Current DateTime (Precision:Hour)'
    5     ,dbo.ufn_Hours(@dtmDate) AS 'The Total Of Hours Base-on Basedate "1900-01-01"'
    6     ,dbo.ufn_Hours2Date(dbo.ufn_Hours(@dtmDate))AS 'Hours Basedatetime Mapping';
    7 GO

     

        执行后的查询结果如下图
     
    SQL Server分钟时间粒度
        
        同小时时间粒度相似,这个粒度是带有分钟时间部分的日期时间,其精确度是分钟的。不过使用datediff(minute, '1900-01-01', @dtmDateTime)时,@dtmDateTime最大只能为“5983-01-24 02:07:00”,也就是datediff(minute, @starddatetime, @enddatetime)的结果值超过int的最大值(2^15 - 1),该函数就会错的。如下图所示的错误:
        实现带分钟的日期时间和整数相互转换的功能函数,T-SQL代码如下:
     
     1 IF OBJECT_ID(N'dbo.ufn_Minutes', 'FN') IS NOT NULL
     2 BEGIN
     3     DROP FUNCTION dbo.ufn_Minutes;
     4 END
     5 GO
     6  
     7 --==================================
     8 -- 功能: 获得指定的日期时间基于基准日期的总小时数(一个整数值)
     9 -- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期
    10 --       结果值为非负整数,从0开始计数。
    11 -- 作者: XXX
    12 -- 创建: yyyy-MM-dd
    13 -- 修改: yyyy-MM-dd XXX 修改内容描述
    14 -- 调用: SET @intMinutes = dbo.ufn_Minutes('2008-01-14 17:10:00');
    15 --==================================
    16 CREATE FUNCTION dbo.ufn_Minutes
    17 (
    18     @dtmDate DATETIME
    19 ) RETURNS INT
    20 AS
    21 BEGIN
    22     SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate);
    23  
    24     -- datepart参数也可以是mi或n
    25     RETURN DATEDIFF(MINUTE, '1900-01-01', @dtmDate)
    26 END
    27 GO
    28  
    29 IF OBJECT_ID(N'dbo.ufn_Minutes2Date', 'FN') IS NOT NULL
    30 BEGIN
    31     DROP FUNCTION dbo.ufn_Minutes2Date;
    32 END
    33 GO
    34  
    35 --==================================
    36 -- 功能: 获得一个整数值基于基准日期对应的日期时间
    37 -- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;
    38 --       如果指定的整数值大于“5983-01-24 02:07:00”对应的整数值时,则其值默认设置为“5983-01-24 02:07:00”对应的整数值
    39 --       结果值为从基准日期开始计数的日期
    40 -- 作者: XXX
    41 -- 创建: yyyy-MM-dd
    42 -- 修改: yyyy-MM-dd XXX 修改内容描述
    43 -- 调用: SET @dtmDate = dbo.ufn_Minutes2Date(56821990) -- '2008-01-14 17:10:00'
    44 --==================================
    45 CREATE FUNCTION dbo.ufn_Minutes2Date 
    46 (
    47     @intMinutes INT
    48 ) RETURNS DATETIME
    49 AS
    50 BEGIN
    51     SET @intMinutes = dbo.ufn_GetValidDateNum(@intMinutes);
    52  
    53     DECLARE @intMinutesMax AS INT;
    54     SET @intMinutesMax = dbo.ufn_Minutes('5983-01-24 02:07:00');
    55  
    56     IF @intMinutes >= @intMinutesMax
    57     BEGIN
    58         SET @intMinutes = @intMinutesMax;
    59     END
    60  
    61     -- datepart参数也可以是mi或n
    62     RETURN DATEADD(MINUTE, @intMinutes, '1900-01-01')
    63 END
    64 GO
     
        测试以上功能函数的效果,T-SQL如下:
    1 DECLARE @dtmDate AS DATETIME;
    2 SET @dtmDate = '2008-01-14 17:10:00';
    3 SELECT @dtmDate AS 'The Current DateTime (Precision:Minute)'
    4     ,dbo.ufn_Minutes(@dtmDate) AS 'The Total Of Minutes Base-on Basedate "1900-01-01"'
    5     ,dbo.ufn_Minutes2Date(dbo.ufn_Minutes(@dtmDate)) AS 'Minute Basedatetime Mapping'
    6 GO
        
        执行后的查询结果如下图
    注意:分钟时间粒度仅仅提供的参考是实现,因为datediff(minute,@dtmStartDate,@dtmEndDate)返回结果值是int数据类型,受int最大值(2^15-1)的限制,建议谨慎使用。
     
    总结语
     
        本文我们学习了带时间部分(小时、分钟)的日期时间和整数相互转换的功能函数,也指出了带分钟的转换为整数的限制。
    参考清单列表

    1、https://msdn.microsoft.com/zh-cn/library/ms186819(v=sql.90).aspx

  • 相关阅读:
    二叉树的构造与遍历
    最长公共子序列
    Python爬虫与数据图表的实现
    降维实例之主成分分析
    数据集之转换器以及估计器
    机器学习算法分类以及开发流程
    数据的降维之特征选择及主成分分析
    特征工程之归一化及标准化
    文本tfidf
    文本特征抽取
  • 原文地址:https://www.cnblogs.com/dzy863/p/5123989.html
Copyright © 2011-2022 走看看