本文目錄列表:1、SQL Server季時間粒度2、SQL Server年時間粒度3、總結語4、參考清單列表SQL Serve季時間粒度 季時間粒度也即是季度時間粒度。一年每3個月是一個季,一年共4季,1月到3月是第1季、4月到6月是第2個季、依次順延。季也是日期時間範圍的,我們也會引入季基準日期....
本文目錄列表: 1、SQL Server季時間粒度
2、SQL Server年時間粒度 3、總結語 4、參考清單列表 SQL Serve季時間粒度 季時間粒度也即是季度時間粒度。一年每3個月是一個季,一年共4季,1月到3月是第1季、4月到6月是第2個季、依次順延。季也是日期時間範圍的,我們也會引入季基準日期,也就是每個季度的第一天。以下提供季基準日期和整數相互轉換的功能的實現,還有獲取指定日期時間所在當前年內的季索引,從1開始計數,包括1、2、3、4。 提供季基準日期和整數相互轉換的功能函數,T-SQL代碼如下:
1 IF OBJECT_ID(N'dbo.ufn_Quarters', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_Quarters; 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 @sintQuarters = dbo.ufn_Quarters('2008-01-14') 15 --================================== 16 CREATE FUNCTION dbo.ufn_Quarters 17 ( 18 @dtmDate DATETIME -- 指定的日期時間 19 ) RETURNS SMALLINT 20 --$Encode$-- 21 AS 22 BEGIN 23 SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate); 24 25 -- datepart參數也可以為qq或q 26 RETURN DATEDIFF(QUARTER, '1900-01-01', @dtmDate); 27 END 28 GO 29 30 IF OBJECT_ID(N'dbo.ufn_Quarters2Date', 'FN') IS NOT NULL 31 BEGIN 32 DROP FUNCTION dbo.ufn_Quarters2Date; 33 END 34 GO 35 36 --================================== 37 -- 功能: 獲得一個整數值基於基準日期對應的季基準日期 38 -- 說明: 如果指定的整數值為NULL或為負整數時,則其值預設為0; 39 -- 如果指定的整數值大於“9999-12-31”對應的整數值時,則其值預設設置為“9999-12-31”對應的整數值; 40 -- 結果值為從基準日期開始計數的日期; 41 -- 季基準日期是指所在季度的第一個月份中第1天對應的日期,比如'2016-06-08'月份的姐旬基準日期為'2016-04-01'。 42 -- 作者: XXX 43 -- 創建: yyyy-MM-dd 44 -- 修改: yyyy-MM-dd XXX 修改內容描述 45 -- 調用: SET @dtmDate = dbo.ufn_Quarters2Date(300) --'1975-02-21' 46 --================================== 47 CREATE FUNCTION dbo.ufn_Quarters2Date 48 ( 49 @sintQuarters SMALLINT 50 ) RETURNS DATETIME 51 --$Encode$-- 52 AS 53 BEGIN 54 SET @sintQuarters = dbo.ufn_GetValidDateNum(@sintQuarters); 55 56 DECLARE @sintMaxQuarters AS SMALLINT; 57 SET @sintMaxQuarters = dbo.ufn_Quarters('9999-12-31'); 58 59 IF @sintQuarters >= @sintMaxQuarters 60 BEGIN 61 SET @sintQuarters = @sintMaxQuarters; 62 END 63 64 -- datepart參數也可以為qq或q 65 RETURN DATEADD(QUARTER, @sintQuarters, '1900-01-01') 66 END 67 GO
獲取指定日期時間在當前年的旬索引的功能函數,T-SQL代碼如下:
1 IF OBJECT_ID(N'dbo.ufn_QuarterOfYear', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_QuarterOfYear; 4 END 5 GO 6 7 --================================== 8 -- 功能: 獲取指定的日期時間所在當前年內的旬索引 9 -- 說明: 結果從1開始計數,1、2、3、4分別表示第1季度、第2季度、第3季度、第4季度。 10 -- 作者: XXX 11 -- 創建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改內容描述 13 -- 調用: SET @tintQuarterOfYear = dbo.ufn_QuarterOfYear('2016-01-11'); 14 --================================== 15 CREATE FUNCTION dbo.ufn_QuarterOfYear 16 ( 17 @dtmDate DATETIME --指定的日期時間 18 ) RETURNS TINYINT 19 --$Encode$-- 20 AS 21 BEGIN 22 -- datepart參數也可以為qq或q 23 RETURN DATEPART(QUARTER, @dtmDate); 24 END 25 GO
測試以上三個功能函數的效果,T-SQL代碼如下:
1 DECLARE @dtmDate AS DATETIME; 2 SET @dtmDate = '2016-01-11'; 3 4 SELECT @dtmDate AS 'The Current Date' 5 ,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"' 6 ,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping' 7 ,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1'; 8 9 SET @dtmDate = '2016-09-11'; 10 11 SELECT @dtmDate AS 'The Current Date' 12 ,dbo.ufn_Quarters(@dtmDate) AS 'The Total Of Quarters Base-on Basedate"1900-01-01"' 13 ,dbo.ufn_Quarters2Date(dbo.ufn_Quarters(@dtmDate)) AS 'Quarter Basedate Mapping' 14 ,dbo.ufn_QuarterOfYear(@dtmDate) AS 'The Quarter IndexID,Starting With 1' 15 GO 16
執行後的查詢結果如下圖:
SQL Server年時間粒度 年時間粒度很容易理解的,在SQL Server提供的有關日期時間數據類型中,能夠支持日期部分的最大範圍區間是[0000-01-01,9999-12-31],那麼指定日期在這個日期範圍的年索引是從1開始,包括1、2、3、……、9998、9999。年基準日期也即是當前年的第一天,比如"2016-01-11"所在當前年的年基準日期是”2016-01-01“,提供年基準日期和整數相互轉換的功能函數實現。 獲取指定的日期時間所在日期的年索引的功能函數,T-SQL代碼如下:1 IF OBJECT_ID(N'dbo.ufn_YearOfDate', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_YearOfDate; 4 END 5 GO 6 7 --================================== 8 -- 功能: 獲取指定的日期時間所在日期內的年索引 9 -- 說明: 結果從1開始計數,1、2、3、……、9998、9999。 10 -- 作者: XXX 11 -- 創建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改內容描述 13 -- 調用: SET @sintYearOfDate = dbo.ufn_YearsOfDate('2016-01-11'); 14 --================================== 15 CREATE FUNCTION dbo.ufn_YearOfDate 16 ( 17 @dtmDate DATETIME --指定的日期時間 18 ) RETURNS SMALLINT 19 --$Encode$-- 20 AS 21 BEGIN 22 RETURN YEAR(@dtmDate); 23 END 24 GO 25
提供年基準日期和整數相互轉換的功能函數,T-SQL代碼如下:
1 IF OBJECT_ID(N'dbo.ufn_Years', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_Years; 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 @intMonths = dbo.ufn_Years('2008-01-14') 15 --================================== 16 CREATE FUNCTION dbo.ufn_Years 17 ( 18 @dtmDate DATETIME -- 指定的日期時間 19 ) RETURNS SMALLINT 20 --$Encode$-- 21 AS 22 BEGIN 23 SET @dtmDate = dbo.ufn_GetValidDate(@dtmDate); 24 25 -- datepart參數也可以為yy或yyyy 26 RETURN DATEDIFF(YEAR, '1900-01-01', @dtmDate) 27 END 28 GO 29 30 IF OBJECT_ID(N'dbo.ufn_Years2Date', 'FN') IS NOT NULL 31 BEGIN 32 DROP FUNCTION dbo.ufn_Years2Date; 33 END 34 GO 35 36 --================================== 37 -- 功能: 獲得一個整數值基於基準日期對應的年基準日期 38 -- 說明: 如果指定的整數值為NULL或為負整數時,則其值預設為0; 39 -- 如果指定的整數值大於“9999-12-31”對應的整數值時,則其值預設設置為“9999-12-31”對應的整數值; 40 -- 結果值為從基準日期開始計數的日期; 41 -- 年基準日期是指所在年的第一個月份中第1天對應的日期,比如'2016-06-08'月份的姐旬基準日期為'2016-01-01'。 42 -- 作者: XXX 43 -- 創建: yyyy-MM-dd 44 -- 修改: yyyy-MM-dd XXX 修改內容描述 45 -- 調用: SET @dtmDate = dbo.ufn_Years2Date(300) --'1975-02-21' 46 --================================== 47 CREATE FUNCTION dbo.ufn_Years2Date 48 ( 49 @sintYears SMALLINT 50 ) RETURNS DATETIME 51 --$Encode$-- 52 AS 53 BEGIN 54 SET @sintYears = dbo.ufn_GetValidDateNum(@sintYears); 55 56 DECLARE @sintMaxYears AS SMALLINT; 57 SET @sintMaxYears = dbo.ufn_Years('9999-12-31'); 58 59 IF @sintYears >= @sintMaxYears 60 BEGIN 61 SET @sintYears = @sintMaxYears; 62 END 63 64 -- datepart參數也可以為yy或yyyy 65 RETURN DATEADD(YEAR, @sintYears, '1900-01-01') 66 END 67 GO
測試以上3個功能函數的效果,T-SQL代碼如下:
1 DECLARE @dtmDate AS DATETIME; 2 SET @dtmDate = '2016-01-11'; 3 4 SELECT @dtmDate AS 'The Current Date' 5 ,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"' 6 ,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping' 7 ,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1'; 8 9 SET @dtmDate = '2016-09-11'; 10 11 SELECT @dtmDate AS 'The Current Date' 12 ,dbo.ufn_Years(@dtmDate) AS 'The Total Of Years Base-on Basedate"1900-01-01"' 13 ,dbo.ufn_Years2Date(dbo.ufn_Years(@dtmDate)) AS 'Year Basedate Mapping' 14 ,dbo.ufn_YearOfDate(@dtmDate) AS 'The Year IndexID,Starting With 1'; 15 GO
執行後的查詢結果如下圖:
總結語 本文主要提供了季和年這兩個時間粒度的講解,也分別提供的其基準日期和整數相互轉換的功能實現,還有各自有關的索引功能函數。之前的博文也有獲取比如旬內日索引、月內日索引、月內旬索引等等的相關功能函數,這些都不是基於基準日期”1900-01-01“,都是在SQL Server能支持的最大的日期部分的範圍區間【0001-01-01,9999-12-31】的。 以上有關季和年有關的功能函數,使用了ufn_GetValidDate和ufn_GetValidDateNum這兩個通用同能函數,可以參考SQL Server時間粒度系列----第3節旬、月時間粒度詳解,裡面有具體的實現。 參考清單列表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