本文目錄列表:1、SQL Server小時時間粒度2、SQL Server分鐘時間粒度3、總結語4、參考清單列表SQL Server小時時間粒度 這裡說的時間粒度是指帶有小時時間部分的日期時間,這個日期時間精確度是小時的。提供將帶小時的日期時間和整數相互轉換的功能,和以前日、周、旬、季、年那樣。 ....
本文目錄列表: 1、SQL Server小時時間粒度
2、SQL Server分鐘時間粒度 3、總結語 4、參考清單列表 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
2、https://msdn.microsoft.com/zh-cn/library/ms189794(v=sql.90).aspx