本文目录列表:
1、SQL Server小时时间粒度
2、SQL Server分钟时间粒度
3、总结语
4、参考清单列表
SQL Server小时时间粒度
这里说的时间粒度是指带有小时时间部分的日期时间,这个日期时间精确度是小时的。提供将带小时的日期时间和整数相互转换的功能,和以前日、周、旬、季、年那样。
实现带小时的日期时间和整数相互转换的功能函数,T-SQL如下:
1 IF OBJECT_ID(N'dbo.ufn_Hours', 'FN') IS NOT NULL 2BEGIN 3 DROP FUNCTION dbo.ufn_Hours; 4END 5GO 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') -- 94703315 --================================== 16CREATE FUNCTION dbo.ufn_Hours 17( 18 @dtmDate DATETIME 19) RETURNS INT 20 --$Encode$-- 21AS 22BEGIN 23 SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate); 2425 -- datepart参数也可以为hh 26 RETURN DATEDIFF(HOUR, '1900-01-01', @dtmDate) 27END 28GO 2930 IF OBJECT_ID(N'dbo.ufn_Hours2Date', 'FN') IS NOT NULL 31BEGIN 32 DROP FUNCTION dbo.ufn_Hours2Date; 33END 34GO 3536 --================================== 37 -- 功能: 获得一个整数值基于基准日期对应的日期时间 38 -- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0; 39 -- 如果指定的整数值大于“9999-12-3123:00:00”对应的整数值时,则其值默认设置为“9999-12-3123: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 --================================== 46CREATE FUNCTION dbo.ufn_Hours2Date 47( 48 @intHours INT 49) RETURNS DATETIME 50AS 51BEGIN 52 SET @intHours = dbo.ufn_GetValidDateNum(@intHours); 5354 DECLARE @intHoursMax AS INT; 55 SET @intHoursMax = dbo.ufn_Hours('9999-12-31 23:00:00'); 5657 IF @intHours >= @intHoursMax 58 BEGIN 59 SET @intHours = @intHoursMax; 60 END 6162 -- datepart参数也可以为hh 63 RETURN DATEADD(hh, @intHours, '1900-01-01') 64END 65 GO
测试以上功能函数的效果,T-SQL如下:
1DECLARE @dtmDate AS DATETIME; 2 SET @dtmDate = '2008-01-14 17:00:00'; 34 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代码如下: