本文目录列表:
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代码如下:
1IFOBJECT_ID(N'dbo.ufn_Quarters', 'FN') ISNOTNULL 2BEGIN 3DROPFUNCTION dbo.ufn_Quarters; 4END 5GO 6 7--================================== 8-- 功能: 获得指定日期时间基于基准日期的总季数(一个整数值) 9-- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期10-- 结果值为非负整数,从0开始计数。11-- 作者: XXX12-- 创建: yyyy-MM-dd13-- 修改: yyyy-MM-dd XXX 修改内容描述14-- 调用: SET @sintQuarters = dbo.ufn_Quarters('2008-01-14')15--==================================16CREATEFUNCTION dbo.ufn_Quarters 17( 18@dtmDateDATETIME-- 指定的日期时间19 ) RETURNSSMALLINT20--$Encode$--21AS22BEGIN23SET@dtmDate= dbo.ufn_GetValidDate(@dtmDate); 2425-- datepart参数也可以为qq或q26RETURNDATEDIFF(QUARTER, '1900-01-01', @dtmDate); 27END28GO2930IFOBJECT_ID(N'dbo.ufn_Quarters2Date', 'FN') ISNOTNULL31BEGIN32DROPFUNCTION dbo.ufn_Quarters2Date; 33END34GO3536--==================================37-- 功能: 获得一个整数值基于基准日期对应的季基准日期38-- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;39-- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;40-- 结果值为从基准日期开始计数的日期;41-- 季基准日期是指所在季度的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-04-01'。42-- 作者: XXX43-- 创建: yyyy-MM-dd44-- 修改: yyyy-MM-dd XXX 修改内容描述45-- 调用: SET @dtmDate = dbo.ufn_Quarters2Date(300) --'1975-02-21'46--==================================47CREATEFUNCTION dbo.ufn_Quarters2Date 48( 49@sintQuartersSMALLINT50 ) RETURNSDATETIME51--$Encode$--52AS53BEGIN54SET@sintQuarters= dbo.ufn_GetValidDateNum(@sintQuarters); 5556DECLARE@sintMaxQuartersASSMALLINT; 57SET@sintMaxQuarters= dbo.ufn_Quarters('9999-12-31'); 5859IF@sintQuarters>=@sintMaxQuarters60BEGIN61SET@sintQuarters=@sintMaxQuarters; 62END6364-- datepart参数也可以为qq或q65RETURNDATEADD(QUARTER, @sintQuarters, '1900-01-01') 66END67GO
获取指定日期时间在当前年的旬索引的功能函数,T-SQL代码如下:
1IFOBJECT_ID(N'dbo.ufn_QuarterOfYear', 'FN') ISNOTNULL 2BEGIN 3DROPFUNCTION dbo.ufn_QuarterOfYear; 4END 5GO 6 7--================================== 8-- 功能: 获取指定的日期时间所在当前年内的旬索引 9-- 说明: 结果从1开始计数,1、2、3、4分别表示第1季度、第2季度、第3季度、第4季度。10-- 作者: XXX11-- 创建: yyyy-MM-dd12-- 修改: yyyy-MM-dd XXX 修改内容描述13-- 调用: SET @tintQuarterOfYear = dbo.ufn_QuarterOfYear('2016-01-11');14--==================================15CREATEFUNCTION dbo.ufn_QuarterOfYear 16( 17@dtmDateDATETIME--指定的日期时间18 ) RETURNSTINYINT19--$Encode$--20AS21BEGIN22-- datepart参数也可以为qq或q23RETURNDATEPART(QUARTER, @dtmDate); 24END25GO
测试以上三个功能函数的效果,T-SQL代码如下:
1DECLARE@dtmDateASDATETIME; 2SET@dtmDate='2016-01-11'; 3 4SELECT@dtmDateAS'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 9SET@dtmDate='2016-09-11'; 1011SELECT@dtmDateAS'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'15GO16
执行后的查询结果如下图:
SQL Server年时间粒度
年时间粒度很容易理解的,在SQL Server提供的有关日期时间数据类型中,能够支持日期部分的最大范围区间是[0000-01-01,9999-12-31],那么指定日期在这个日期范围的年索引是从1开始,包括1、2、3、……、9998、9999。年基准日期也即是当前年的第一天,比如"2016-01-11"所在当前年的年基准日期是”2016-01-01“,提供年基准日期和整数相互转换的功能函数实现。
获取指定的日期时间所在日期的年索引的功能函数,T-SQL代码如下:
1IFOBJECT_ID(N'dbo.ufn_YearOfDate', 'FN') ISNOTNULL 2BEGIN 3DROPFUNCTION dbo.ufn_YearOfDate; 4END 5GO 6 7--================================== 8-- 功能: 获取指定的日期时间所在日期内的年索引 9-- 说明: 结果从1开始计数,1、2、3、……、9998、9999。10-- 作者: XXX11-- 创建: yyyy-MM-dd12-- 修改: yyyy-MM-dd XXX 修改内容描述13-- 调用: SET @sintYearOfDate = dbo.ufn_YearsOfDate('2016-01-11');14--==================================15CREATEFUNCTION dbo.ufn_YearOfDate 16( 17@dtmDateDATETIME--指定的日期时间18 ) RETURNSSMALLINT19--$Encode$--20AS21BEGIN22RETURNYEAR(@dtmDate); 23END24GO25
提供年基准日期和整数相互转换的功能函数,T-SQL代码如下:
1IFOBJECT_ID(N'dbo.ufn_Years', 'FN') ISNOTNULL 2BEGIN 3DROPFUNCTION dbo.ufn_Years; 4END 5GO 6 7--================================== 8-- 功能: 获得指定日期时间基于基准日期的总年数(一个整数值) 9-- 说明: 如果指定的日期时间为NULL或者小于基准日期“1900-01-01”时,则其值默认基准日期10-- 结果值为非负整数,从0开始计数。11-- 作者: XXX12-- 创建: yyyy-MM-dd13-- 修改: yyyy-MM-dd XXX 修改内容描述14-- 调用: SET @intMonths = dbo.ufn_Years('2008-01-14')15--==================================16CREATEFUNCTION dbo.ufn_Years 17( 18@dtmDateDATETIME-- 指定的日期时间19 ) RETURNSSMALLINT20--$Encode$--21AS22BEGIN23SET@dtmDate= dbo.ufn_GetValidDate(@dtmDate); 2425-- datepart参数也可以为yy或yyyy26RETURNDATEDIFF(YEAR, '1900-01-01', @dtmDate) 27END28GO2930IFOBJECT_ID(N'dbo.ufn_Years2Date', 'FN') ISNOTNULL31BEGIN32DROPFUNCTION dbo.ufn_Years2Date; 33END34GO3536--==================================37-- 功能: 获得一个整数值基于基准日期对应的年基准日期38-- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;39-- 如果指定的整数值大于“9999-12-31”对应的整数值时,则其值默认设置为“9999-12-31”对应的整数值;40-- 结果值为从基准日期开始计数的日期;41-- 年基准日期是指所在年的第一个月份中第1天对应的日期,比如'2016-06-08'月份的姐旬基准日期为'2016-01-01'。42-- 作者: XXX43-- 创建: yyyy-MM-dd44-- 修改: yyyy-MM-dd XXX 修改内容描述45-- 调用: SET @dtmDate = dbo.ufn_Years2Date(300) --'1975-02-21'46--==================================47CREATEFUNCTION dbo.ufn_Years2Date 48( 49@sintYearsSMALLINT50 ) RETURNSDATETIME51--$Encode$--52AS53BEGIN54SET@sintYears= dbo.ufn_GetValidDateNum(@sintYears); 5556DECLARE@sintMaxYearsASSMALLINT; 57SET@sintMaxYears= dbo.ufn_Years('9999-12-31'); 5859IF@sintYears>=@sintMaxYears60BEGIN61SET@sintYears=@sintMaxYears; 62END6364-- datepart参数也可以为yy或yyyy65RETURNDATEADD(YEAR, @sintYears, '1900-01-01') 66END67GO
测试以上3个功能函数的效果,T-SQL代码如下: