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

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/dzy863/p/5123989.html
Copyright © 2011-2022 走看看