当前位置:Gxlcms > 数据库问题 > SQL Server时间粒度系列----第7节日历数据表详解

SQL Server时间粒度系列----第7节日历数据表详解

时间:2021-07-01 10:21:17 帮助过:5人阅读

日期分钟* 日内分钟数           小时 日期小时数(整数) 日期小时 日内小时数           天 日期天数(整数) 日期天 周内日索引 旬内日索引 月内日索引 季内日索引 年内日索引 日期内日索引 周 日期周数(整数) 日期周 旬内周索引 月内周索引 季内周索引 年内周索引 日期内周索引   旬 日期旬数(整数) 日期旬 月内旬索引 季内旬索引 年内旬索引 日期内旬索引     月 日期月数(整数) 日期月 季内月索引 年内月索引 日期内月索引       季 日期季数(整数) 日期季 年内季索引 日期内季索引         年 日期年数(整数) 日期年 日期内年索引           注意: 1、最左边第一列表示时间粒度,其左边列的空格表示没有相应的参数,有文字表示有相对应的功能函数。 2、带有数的描述从0开始计数,带有索引则是从1开始计数。 3、日期天和日期天数(整数)是一对一映射的,一个日期对应一个整数。日期周、日期旬、日期月、日期季、日期年都是其时间粒度的基准日期的。 4、日期内相关的索引这个日期内是个范围区间[0001-01-01,9999-12-31],时间粒度日、周、旬、月、季、年的有关日期内的相关索引都是基于这个范围区间计算的。 5、带有*符号的表示谨慎使用。   时间维度有关功能函数          根据时间粒度有关表述中总结的表格,将提供的时间粒度有关功能函数分为:日期时间通用有关函数、分钟时间粒度有关函数、 小时时间粒度有关函数、周以上时间粒度基准日期有关函数、天时间粒度有关函数、周时间粒度有关函数、旬时间粒度有关函数、月时间粒度有关函数、季时间粒度有关函数、年时间粒度有关函数。日期时间通用函数主要包括获取最小日期时间、获取最大日期时间、获取默认基准日期以及获取有效日期时间和有效日期时间数的函数。周以上时间粒度基准日期就是获取周、旬、月、季、年和日期的相关基准日期,都是其时间刻度的第一天所对应的日期范围。       日期时间通用有关函数,T-SQL代码如下: IF OBJECT_ID(N‘dbo.ufn_GetMinDateTime‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_GetMinDateTime END GO   --================================== -- 功能: 获取最小日期时间 -- 说明: 运行在SQL Server 2008+。 --       结果值为date数据类型。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_GetMinDateTime(); --================================== CREATE FUNCTION dbo.ufn_GetMinDateTime (   ) RETURNS DATE     --$Encode$-- AS  BEGIN     RETURN ‘0001-01-01‘; END GO   IF OBJECT_ID(N‘dbo.ufn_GetMaxDateTime‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_GetMaxDateTime END GO   --================================== -- 功能: 获取最最大日期时间 -- 说明: 运行在SQL Server 2005+。 --       结果值为datetime数据类型。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_GetMaxDateTime(); --================================== CREATE FUNCTION dbo.ufn_GetMaxDateTime (   ) RETURNS DATETIME     --$Encode$-- AS  BEGIN     RETURN ‘9999-12-31 23:59:59‘; END GO   IF OBJECT_ID(N‘dbo.ufn_GetDefaultBasedate‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_GetDefaultBasedate END GO   --================================== -- 功能: 获取默认基准日期 -- 说明: 运行在SQL Server 2005+。 --       默认设置为"1900-01-01",调整范围区间为[1753-01-01,9999-12-31];可以调整为该区间任意一个日期,不能为该区间以外的。 --       结果值为datetime数据类型。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_GetDefaultBasedate(); --================================== CREATE FUNCTION dbo.ufn_GetDefaultBasedate (   ) RETURNS DATETIME     --$Encode$-- AS  BEGIN     RETURN ‘1900-01-01‘; END GO   -- Test Code SELECT dbo.ufn_GetMinDateTime() AS ‘MinDateTime‘     ,dbo.ufn_GetMaxDateTime() AS ‘MaxDateTime‘     ,dbo.ufn_GetDefaultBasedate() AS ‘DefaultBasedate‘; GO   IF OBJECT_ID(N‘dbo.ufn_GetValidDate‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_GetValidDate; END GO   --================================== -- 功能: 获取有效日期 -- 说明: 运行在SQL Server 2005+。 --         指定的日期如果为NULL或者小于默认基准日期时则直接返回默认基准日期。 --       结果值为datetime数据类型。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmDate = dbo.ufn_GetValidDate(‘2008-01-14‘) --================================== CREATE FUNCTION dbo.ufn_GetValidDate (     @dtmDate DATETIME            -- 指定的日期时间 ) RETURNS DATETIME     --$Encode$-- BEGIN     DECLARE @dtmDefaultBasedate AS DATETIME;     SET @dtmDefaultBasedate = dbo.ufn_GetDefaultBasedate();       IF @dtmDate IS NULL OR @dtmDate < @dtmDefaultBasedate     BEGIN         RETURN @dtmDefaultBasedate;     END       RETURN @dtmDate; END GO   IF OBJECT_ID(N‘dbo.ufn_GetValidDateNum‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION ufn_GetValidDateNum; END GO   --================================== -- 功能: 获取有效日期数 -- 说明: 运行在SQL Server 2005+。 --       指定的日期数如果为NULL或负数,则默认设置为0。 --       结果值为datetime数据类型。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @@intDateNum = dbo.ufn_GetValidDateNum(-1) --================================== CREATE FUNCTION dbo.ufn_GetValidDateNum (     @intDateNum INT            -- 指定的日期数 ) RETURNS INT     --$Encode$-- BEGIN     IF @intDateNum IS NULL OR @intDateNum < 0     BEGIN         RETURN 0;     END       RETURN @intDateNum; END GO   -- Test Code SELECT dbo.ufn_GetValidDate(‘1899-01-01‘) AS ‘ValidDate‘     ,dbo.ufn_GetValidDateNum(0) AS ‘ValidDateNum‘; GO   以上5个通用函数的测试效果,如下图: 技术分享 技术分享       分钟时间粒度有关函数,T-SQL代码如下:  IF OBJECT_ID(N‘dbo.ufn_Minutes‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Minutes; END GO   --================================== -- 功能: 获得指定的日期时间基于默认基准日期的总小时数(一个整数值) -- 说明: 运行在SQL Server 2005 +。 --       如果指定的日期时间为NULL或者小于默认基准日期时,则其值为默认基准日期。 --       结果值为非负整数,从0开始计数。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intMinutes = dbo.ufn_Minutes(‘5983-01-24 02:07:00.000‘); --================================== CREATE FUNCTION dbo.ufn_Minutes (     @dtmDate DATETIME                    -- 指定的日期时间 ) RETURNS INT AS BEGIN     RETURN DATEDIFF(MINUTE, dbo.ufn_GetDefaultBasedate(), dbo.ufn_GetValidDate(@dtmDate)); END GO   IF OBJECT_ID(N‘dbo.ufn_Minutes2Date‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Minutes2Date; END GO   --================================== -- 功能: 获得一个整数值基于默认基准日期对应的日期时间 -- 说明: 运行在SQL Server 2005+。 --       如果指定的整数值为NULL或为负整数时,则其值默认为0。 --       如果指定的整数值大于“5983-01-24 02:07:00”对应的整数值时,则其值默认设置为“5983-01-24 02:07:00”对应的整数值。 --       结果值为基于默认基准日期开始计数的日期。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmDate = dbo.ufn_Minutes2Date(947033) -- ‘2008-01-14 17:00‘ --================================== CREATE FUNCTION dbo.ufn_Minutes2Date (     @intMinutes INT                -- 指定的整数值 ) RETURNS DATETIME AS BEGIN     SET @intMinutes = dbo.ufn_GetValidDateNum(@intMinutes);       DECLARE @intMinutesMax AS INT;     SET @intMinutesMax = dbo.ufn_Minutes(‘5983-01-24 02:07:00‘);       IF @intMinutes >= @intMinutesMax     BEGIN         SET @intMinutes = @intMinutesMax;     END       RETURN DATEADD(MINUTE, @intMinutes, dbo.ufn_GetDefaultBasedate()); END GO   IF OBJECT_ID(N‘dbo.ufn_MinutesOfDay‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_MinutesOfDay; END GO   --================================== -- 功能: 获取指定的日期时间基于所在当前日午夜零时的分钟数 -- 功能: 运行在SQL Server 2005+。 --       结果值从0开始计数,包括0、1、2、3、1439。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @sintMinutesOfDay = dbo.fn_MinutesOfDay(GETDATE()); --================================== CREATE FUNCTION dbo.ufn_MinutesOfDay (     @dtmDate DATETIME                    -- 指定的日期时间 ) RETURNS SMALLINT AS BEGIN     RETURN DATEPART(HOUR, @dtmDate) * 60 + DATEPART(MINUTE, @dtmDate); END GO   -- Test Code DECLARE @dtmDate AS DATETIME; SET @dtmDate = ‘2016-02-14 02:14:18‘;   SELECT     @dtmDate AS ‘The Current DateTime‘     ,dbo.ufn_Minutes(@dtmDate) AS ‘Minutes‘     ,dbo.ufn_Minutes2Date(dbo.ufn_Minutes(@dtmDate)) AS ‘DateTime Mapping Minutes‘     ,dbo.ufn_MinutesOfDay(@dtmDate) AS ‘Minutes Of The Current Day‘;   SET @dtmDate = ‘2016-05-20 05:20:48‘;   SELECT      @dtmDate AS ‘The Current DateTime‘     ,dbo.ufn_Minutes(@dtmDate) AS ‘Minutes‘     ,dbo.ufn_Minutes2Date(dbo.ufn_Minutes(@dtmDate)) AS ‘DateTime Mapping Minutes‘     ,dbo.ufn_MinutesOfDay(@dtmDate) AS ‘Minutes Of The Current Day‘; GO   以上3个函数的测试效果,如下图: 技术分享 技术分享       小时时间粒度有关函数,T-SQL代码如下: IF OBJECT_ID(N‘dbo.ufn_Hours‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Hours; END GO   --================================== -- 功能: 获得指定的日期时间基于基准日期的总小时数(一个整数值) -- 说明: 运行在SQL Server 2005+。 --       如果指定的日期时间为NULL或者小于默认基准日期时,则其值为默认基准日期。 --       结果值为非负整数,从0开始计数。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intHours = dbo.ufn_Hours(‘2008-01-14 17:45‘)  -- 947033 --================================== CREATE FUNCTION dbo.ufn_Hours  (     @dtmDate DATETIME                    -- 指定的日期时间 ) RETURNS INT     --$Encode$-- AS BEGIN     RETURN DATEDIFF(HOUR, dbo.ufn_GetDefaultBasedate(), dbo.ufn_GetValidDate(@dtmDate)); END GO   IF OBJECT_ID(N‘dbo.ufn_Hours2Date‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Hours2Date; END GO   --================================== -- 功能: 获得一个整数值基于基准日期对应的日期时间 -- 说明: 运行在SQL Server 2005+。 --       如果指定的整数值为NULL或为负整数时,则其值默认为0; --       如果指定的整数值大于“9999-12-31 23:00:00”对应的整数值时,则其值默认设置为“9999-12-31 23:00:00”对应的整数值。 --       结果值为基于默认基准日期开始计数的日期。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmDate = dbo.fn_Hours2Date(947033) -- ‘2008-01-14 17:00‘ --================================== CREATE FUNCTION dbo.ufn_Hours2Date  (     @intHours INT                        -- 指定的整数值 ) RETURNS DATETIME AS BEGIN     SET @intHours = dbo.ufn_GetValidDateNum(@intHours);       DECLARE @intMaxHours AS INT;     SET @intMaxHours = dbo.ufn_Hours(dbo.ufn_GetMaxDateTime());       IF @intHours >= @intMaxHours     BEGIN         SET @intHours = @intMaxHours;     END       RETURN DATEADD(HOUR, @intHours, dbo.ufn_GetDefaultBasedate()); END GO     IF OBJECT_ID(N‘dbo.ufn_HoursOfDay‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_HoursOfDay; END GO   --================================== -- 功能: 获取指定的日期日期基于所在当期日午夜零时的小时数 -- 说明: 运行在SQL Server 2005+。 --       结果值从0开始计数,包括0、1、2、……、23。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @tintHoursOfDay = dbo.ufn_HoursOfDay(GETDATE()); --================================== CREATE FUNCTION dbo.ufn_HoursOfDay (     @dtmDate DATETIME            -- 指定的日期时间 ) RETURNS TINYINT AS BEGIN     RETURN DATEPART(HOUR, @dtmDate); END GO     -- Test Code DECLARE @dtmDate AS DATETIME; SET @dtmDate = ‘2014-02-14 6:12:00‘   SELECT      @dtmDate AS ‘The Current DateTime‘     ,dbo.ufn_Hours(@dtmDate) AS ‘Hours‘     ,dbo.ufn_Hours2Date(dbo.ufn_Hours(@dtmDate)) AS ‘DateTime Mapping Hours‘     ,dbo.ufn_HoursOfDay(@dtmDate) AS ‘Hours Of The Current Day‘;   SET @dtmDate = ‘2014-05-20 8:18:00‘   SELECT     @dtmDate AS ‘The Current DateTime‘     ,dbo.ufn_Hours(@dtmDate) AS ‘Hours‘     ,dbo.ufn_Hours2Date(dbo.ufn_Hours(@dtmDate)) AS ‘DateTime Mapping Hours‘     ,dbo.ufn_HoursOfDay(@dtmDate) AS ‘Hours Of The Current Day‘ GO   以上3个函数的测试效果,如下图: 技术分享 技术分享      周以上时间粒度基准日期有关函数,T-SQL代码如下:    IF OBJECT_ID(N‘dbo.ufn_FirstDayOfPeriodTable‘, ‘IF‘) IS NOT NULL BEGIN     DROP FUNCTION ufn_FirstDayOfPeriodTable; END GO   --================================== -- 功能: 旬首日索引表 -- 说明: 运行在SQL Server 2005+。 --       结果值为表数据,列名为FirstDayOfPeriod,其字段列(域)值包括1、11、21这3个数字,其字段列值对应每年每个旬的第一天。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT * FROM dbo.ufn_FirstDayOfPeriodTable(); --================================== CREATE FUNCTION dbo.ufn_FirstDayOfPeriodTable (   ) RETURNS TABLE     --$Encode$--     RETURN (          SELECT 1 AS FirstDayOfPeriod         UNION ALL SELECT 11         UNION ALL SELECT 21     ); GO   IF OBJECT_ID(N‘dbo.ufn_FirstDayOfPeriod‘, N‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_FirstDayOfPeriod; END GO   --================================== -- 功能: 获取指定的日期时间所在当前旬的第一个日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、11、21。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT @tintFirstDayOfPeriod = ufn_FirstDayOfPeriod(@dtmDate); --================================== CREATE FUNCTION dbo.ufn_FirstDayOfPeriod (     @dtmDate DATETIME                    -- 指定的日期时间   ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE @tintFirstDayOfPeriod AS TINYINT;     SET @tintFirstDayOfPeriod = 1;       SELECT TOP 1 @tintFirstDayOfPeriod = FirstDayOfPeriod     FROM dbo.ufn_FirstDayOfPeriodTable()     WHERE FirstDayOfPeriod <= DAY(@dtmDate)     ORDER BY FirstDayOfPeriod DESC;       RETURN @tintFirstDayOfPeriod; END GO   IF OBJECT_ID(N‘dbo.ufn_BasedateOfPeriod‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_BasedateOfPeriod; END GO   --================================== -- 功能: 获取指定的日期时间所在旬的基准日期 -- 说明: 运行在SQL Server 2005+。 --       结果值为旬基准日,即每个旬第一天对应的日期。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmBasedateOfPeriod = dbo.ufn_BasedateOfPeriod(‘2016-01-12‘); --================================== CREATE FUNCTION dbo.ufn_BasedateOfPeriod (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS DATETIME     --$Encode$-- BEGIN     RETURN CONVERT(DATETIME, CAST(YEAR(@dtmDate) AS CHAR(4)) + ‘-‘ + CAST(MONTH(@dtmDate) AS VARCHAR(2)) + ‘-‘ + CAST(dbo.ufn_FirstDayOfPeriod(@dtmDate) AS VARCHAR(2)), 120); END GO   IF OBJECT_ID(N‘dbo.ufn_BasedateOfMonth‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_BasedateOfMonth; END GO   --================================== -- 功能: 获取指定日期时间所在月的基准日期 -- 说明: 运行在SQL Server 2005+。 --       结果值为月基准日,即每个月第一天对应的日期。  -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmBasedateOfMonth = dbo.ufn_BasedateOfMonth(‘2016-01-12‘); --================================== CREATE FUNCTION dbo.ufn_BasedateOfMonth (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS DATETIME     --$Encode$-- BEGIN     RETURN CONVERT(DATETIME, CAST(YEAR(@dtmDate) AS CHAR(4)) + ‘-‘ + CAST(MONTH(@dtmDate) AS VARCHAR(2)) + ‘-‘ + CAST(1 AS CHAR(1)), 120); END GO   IF OBJECT_ID(N‘dbo.ufn_FirstMonthOfQuarterTable‘, ‘IF‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_FirstMonthOfQuarterTable; END GO   --================================== -- 功能: 季首月索引表 -- 说明: 运行在SQL Server 2005+。 --       结果值为表数据,列名为FirstMonthOfQuarter,其字段列(域)值包括1、4、7、10这4个数字,其字段列值对应每年每个季的第一个月份。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT * FROM dbo.ufn_FirstMonthOfQuarterTable(); --================================== CREATE FUNCTION dbo.ufn_FirstMonthOfQuarterTable ( ) RETURNS TABLE     --$Encode$--     RETURN (          SELECT 1 AS FirstMonthOfQuarter         UNION ALL SELECT 4         UNION ALL SELECT 7         UNION ALL SELECT 10     ); GO   IF OBJECT_ID(N‘dbo.ufn_FirstMonthOfQuarter‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_FirstMonthOfQuarter; END GO   --================================== -- 功能: 获取指定的日期时间所在当前季度的第一个月索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、4、7、10。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT @tintFirstMonthOfQuarter = ufn_FirstMonthOfQuarter(@dtmDate); --================================== CREATE FUNCTION dbo.ufn_FirstMonthOfQuarter (     @dtmDate DATETIME                    -- 指定的日期时间   ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE @tintFirstMonthOfQuarter AS TINYINT;     SET @tintFirstMonthOfQuarter = 1;       SELECT TOP 1 @tintFirstMonthOfQuarter = FirstMonthOfQuarter     FROM dbo.ufn_FirstMonthOfQuarterTable()      WHERE FirstMonthOfQuarter <= MONTH(@dtmDate)     ORDER BY FirstMonthOfQuarter DESC;       RETURN @tintFirstMonthOfQuarter; END GO   IF OBJECT_ID(N‘dbo.ufn_BasedateOfQuarter‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_BasedateOfQuarter; END GO   --================================== -- 功能: 获取指定的日期时间所在当前季的季基准日期 -- 说明: 运行在SQL Server 2005+。 --       结果值格式"XXXX-01-01",包括:"XXXX-01-01"、"XXXX-04-01"、"XXXX-07-01"、"XXXX-10-01"。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT @tintFirstMonthOfQuarter = ufn_BasedateOfQuarter(@dtmDate); --================================== CREATE FUNCTION dbo.ufn_BasedateOfQuarter (     @dtmDate DATETIME                    -- 指定的日期时间   ) RETURNS DATETIME     --$Encode$-- BEGIN     RETURN  CONVERT(DATETIME, CAST(YEAR(@dtmDate) AS CHAR(4)) + ‘-‘ + CAST(dbo.ufn_FirstMonthOfQuarter(@dtmDate) AS VARCHAR(2)) + ‘-‘ + CAST(1 AS CHAR(1)), 120); END GO     IF OBJECT_ID(N‘dbo.ufn_BasedateOfYear‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_BasedateOfYear; END GO --================================== -- 功能: 获取指定日期时间所在年的基准日期 -- 说明: 结果值是每个年的基准日,每个年第一天对应的日期。  -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmBasedateOfYear = dbo.ufn_BasedateOfYear(‘2016-01-12‘); --================================== CREATE FUNCTION dbo.ufn_BasedateOfYear (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS DATETIME     --$Encode$-- BEGIN     RETURN CONVERT(DATETIME, CAST(YEAR(@dtmDate) AS CHAR(4)) + ‘-‘ + CAST(1 AS CHAR(1)) +  ‘-‘ + CAST(1 AS char(1)), 120); END GO   -- Test Code DECLARE @dtmDate AS DATETIME; SET @dtmDate = ‘2016-01-14‘;   SELECT      @dtmDate AS ‘The Current Date‘     ,dbo.ufn_BasedateOfPeriod(@dtmDate) AS ‘Basedate Of The Current Period‘     ,dbo.ufn_BasedateOfMonth(@dtmDate) AS ‘Basedate Of The Current Month‘     ,dbo.ufn_BasedateOfQuarter(@dtmDate) AS ‘Basedate Of the Current Quarter‘     ,dbo.ufn_BasedateOfYear(@dtmDate) AS ‘Basedate Of the Current Year‘     ,dbo.ufn_GetMinDateTime() AS ‘Basedate Of the Current Date‘;   SET @dtmDate = ‘2016-4-30‘;   SELECT     @dtmDate AS ‘The Current Date‘     ,dbo.ufn_BasedateOfPeriod(@dtmDate) AS ‘Basedate Of The Current Period‘     ,dbo.ufn_BasedateOfMonth(@dtmDate) AS ‘Basedate Of The Current Month‘     ,dbo.ufn_BasedateOfQuarter(@dtmDate) AS ‘Basedate Of the Current Quarter‘     ,dbo.ufn_BasedateOfYear(@dtmDate) AS ‘Basedate Of the Current Year‘     ,dbo.ufn_GetMinDateTime() AS ‘Basedate Of the Current Date‘; GO   以上几个函数的测试效果,如下图: 技术分享 技术分享         天时间粒度有关函数,T-SQL代码如下: IF OBJECT_ID(N‘dbo.ufn_Days‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Days; END GO   --================================== -- 功能: 获得指定日期时间基于默认基准日期的总天数(一个整数值) -- 说明: 运行在SQL Server 2005+。 --       如果指定的日期时间为NULL或者小于默认基准日期时,则其值为默认基准日期。 --       结果值为非负整数,从0开始计数。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intDays = dbo.ufn_Days(‘2008-01-14‘) --================================== CREATE FUNCTION dbo.ufn_Days (     @dtmDate DATETIME                    -- 指定的日期时间 ) RETURNS INT     --$Encode$-- AS BEGIN     RETURN DATEDIFF(DAY, dbo.ufn_GetDefaultBasedate(), dbo.ufn_GetValidDate(@dtmDate)); END GO   IF OBJECT_ID(N‘dbo.ufn_Days2Date‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Days2Date; END GO   --================================== -- 功能: 获得一个整数值基于默认基准日期对应的日期 -- 说明: 运行在SQL Server 2005+。 --       如果指定的整数值为NULL或为负整数时,则其值默认为0。 --       如果指定的整数值大于最大日期时间对应的整数值时,则其值默认设置为最大日期时间对应的整数值。 --       结果值为基于默认基准日期开始计数的日期。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmDate = dbo.ufn_Days2Date(39459) --‘2008-01-14‘ --================================== CREATE FUNCTION dbo.ufn_Days2Date  (     @intDays INT                -- 指定的整数值 ) RETURNS DATETIME     --$Encode$-- AS BEGIN     SET @intDays = dbo.ufn_GetValidDateNum(@intDays);       DECLARE @intMaxDays AS INT;     SET @intMaxDays = dbo.ufn_Days(dbo.ufn_GetMaxDateTime());       IF @intDays >= @intMaxDays     BEGIN         SET @intDays = @intMaxDays;     END       RETURN DATEADD(DAY, @intDays, dbo.ufn_GetDefaultBasedate()); END GO   IF OBJECT_ID(N‘dbo.ufn_DayOfWeek‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfWeek; END GO   --================================== -- 功能: 获取指定日期时间的所在当前周的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1到7,分别对应从周一到周日,该值与@@DATEFISRT配置函数值保持一致。 --       使用(@@datefirt + datepart(weekday, @dtmDate))%7的结果值从2、3、4、5、6、0、1 --       分别对应周一、周二、周三、周四、周五、周六、周日。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_DayOfWeek(‘2017-01-07‘) -- 4(表示星期四) --================================== CREATE FUNCTION dbo.ufn_DayOfWeek (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE    @tintRemainder AS TINYINT;     SET @tintRemainder = (@@DATEFIRST + DATEPART(WEEKDAY, @dtmDate)) % 7;     IF @tintRemainder <= 1     BEGIN         SET @tintRemainder = @tintRemainder + 6;     END     ELSE     BEGIN         SET @tintRemainder = @tintRemainder - 1;     END       RETURN @tintRemainder; END GO   IF OBJECT_ID(N‘dbo.ufn_DayOfPeriod‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfPeriod; END GO   --================================== -- 功能: 获得指定日期时间在当前旬的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3、……、8、9、10、11。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intPeriods = dbo.ufn_DayOfPeriod(‘2008-01-14‘) --================================== CREATE FUNCTION dbo.ufn_DayOfPeriod (     @dtmDate DATETIME            -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- AS BEGIN     --RETURN DAY(@dtmDate) - (dbo.ufn_PeriodOfMonth(@dtmDate) - 1) * 10;     RETURN DATEDIFF(DAY, dbo.ufn_BasedateOfPeriod(@dtmDate), @dtmDate) + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_DayOfMonth‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfMonth; END GO   --================================== -- 功能: 获取指定的日期时间所在当前月的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3.……、28、29、30、31。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @sintDayOfYear = dbo.ufn_DayOfMonth(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_DayOfMonth (     @dtmDate DATETIME            -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- BEGIN     RETURN DAY(@dtmDate); END GO   IF OBJECT_ID(N‘dbo.ufn_DayOfQuarter‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfQuarter; END GO   --================================== -- 功能: 获取指定的日期时间所在季的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3.……、89、90、91、92。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 --================================== CREATE FUNCTION dbo.ufn_DayOfQuarter (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- BEGIN     RETURN DATEDIFF(DAY, dbo.ufn_BasedateOfQuarter(@dtmDate), @dtmDate) + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_DayOfYear‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfYear; END GO   --================================== -- 功能: 获取指定的日期时间所在当前年的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3.……、364、365、366。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @sintDayOfYear = dbo.ufn_DayOfYear(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_DayOfYear (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS SMALLINT     --$Encode$-- BEGIN     RETURN DATEPART(DAYOFYEAR, @dtmDate); END GO     IF OBJECT_ID(N‘dbo.ufn_DayOfDate‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_DayOfDate; END GO   --================================== -- 功能: 获取指定的日期时间所在当前日期的日索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3.……、3652057、3652058、3652059。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @inntDayOfDate = dbo.ufn_DayOfDate(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_DayOfDate (     @dtmDate DATETIME ) RETURNS INT     --$Encode$-- BEGIN     RETURN DATEDIFF(DAY, dbo.ufn_GetMinDateTime(), dbo.ufn_GetValidDate(@dtmDate)) + 1 END GO     -- Test Code DECLARE @dtmDate AS DATETIME; SET @dtmDate = ‘2016-01-14‘;   SELECT     @dtmDate AS ‘The Current Date‘     ,dbo.ufn_Days(@dtmDate) AS ‘Days‘     ,dbo.ufn_Days2Date(dbo.ufn_Days(@dtmDate)) AS ‘Date Mapping Days‘     ,dbo.ufn_DayOfWeek(@dtmDate) AS ‘Day Of The Current Week‘     ,dbo.ufn_DayOfPeriod(@dtmDate) AS ‘Day Of The Current Period‘     ,dbo.ufn_DayOfMonth(@dtmDate) AS ‘Day Of The Current Month‘     ,dbo.ufn_DayOfQuarter(@dtmDate) AS ‘Day Of The Current Quarter‘     ,dbo.ufn_DayOfYear(@dtmDate) AS ‘Day Of The Current Year‘     ,dbo.ufn_DayOfDate(@dtmDate) AS ‘Day Of The Current Date‘;   SET @dtmDate = ‘2016-03-14‘;   SELECT     @dtmDate AS ‘The Current Date‘     ,dbo.ufn_Days(@dtmDate) AS ‘Days‘     ,dbo.ufn_Days2Date(dbo.ufn_Days(@dtmDate)) AS ‘Date Mapping Days‘     ,dbo.ufn_DayOfWeek(@dtmDate) AS ‘Day Of The Current Week‘     ,dbo.ufn_DayOfPeriod(@dtmDate) AS ‘Day Of The Current Period‘     ,dbo.ufn_DayOfMonth(@dtmDate) AS ‘Day Of The Current Month‘     ,dbo.ufn_DayOfQuarter(@dtmDate) AS ‘Day Of The Current Quarter‘     ,dbo.ufn_DayOfYear(@dtmDate) AS ‘Day Of The Current Year‘     ,dbo.ufn_DayOfDate(@dtmDate) AS ‘Day Of The Current Date‘; GO   以上几个函数的测试效果,如下图: 技术分享 技术分享      周时间粒度有关函数,T-SQL代码如下: IF OBJECT_ID(N‘dbo.ufn_Weeks‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Weeks; END GO   --================================== -- 功能: 获得指定日期时间基于默认基准日期的总周数(一个整数值) -- 说明: 运行在SQL Server 2005+。 --       如果指定的日期时间为NULL或者小于默认基准日期时,则其值为默认基准日期。 --       结果值为非负整数,从0开始计数。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intDays = dbo.ufn_Weeks(‘2008-01-14‘) --================================== CREATE FUNCTION dbo.ufn_Weeks (     @dtmDate DATETIME                    -- 指定的日期时间 ) RETURNS INT     --$Encode$-- AS BEGIN     RETURN dbo.ufn_Days(@dtmDate) / 7; END GO   IF OBJECT_ID(N‘dbo.ufn_Weeks2Date‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_Weeks2Date; END GO   --================================== -- 功能: 获得一个整数值基于默认基准日期对应的日期 -- 说明: 运行在SQL Server 2005+。 --       如果指定的整数值为NULL或为负整数时,则其值默认为0; --       如果指定的整数值大于最大日期时间对应的整数值时,则其值默认设置为最大日期时间对应的整数值。 --       结果值为基于默认基准日期开始计数的周基准日期,也就是周一对应的日期。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @dtmDate = dbo.ufn_Weeks2Date(39459); --================================== CREATE FUNCTION dbo.ufn_Weeks2Date (     @intWeeks INT                    -- 指定的整数值 ) RETURNS DATETIME     --$Encode$-- AS BEGIN     SET @intWeeks = dbo.ufn_GetValidDateNum(@intWeeks);       DECLARE @intMaxWeeks AS INT;     SET @intMaxWeeks = dbo.ufn_Weeks(dbo.ufn_GetMaxDateTime());       IF @intWeeks >= @intMaxWeeks     BEGIN         SET @intWeeks = @intMaxWeeks;     END       RETURN DATEADD(DAY, @intWeeks * 7, dbo.ufn_GetDefaultBasedate()); END GO   IF OBJECT_ID(N‘dbo.ufn_WeekOfPeriod‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_WeekOfPeriod; END GO   --================================== -- 功能: 获取指定的日期时间所在当前旬的周索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @tintWeekOfPeriod = dbo.ufn_WeekOfPeriod(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_WeekOfPeriod (     @dtmDate DATETIME                -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE @tintWeekOffsetOfPeriod AS TINYINT;     SET @tintWeekOffsetOfPeriod = DATEDIFF(WEEK, dbo.ufn_BasedateOfPeriod(@dtmDate), @dtmDate);       IF dbo.ufn_DayOfWeek(@dtmDate) = 7 AND @tintWeekOffsetOfPeriod >= 1     BEGIN         SET @tintWeekOffsetOfPeriod = @tintWeekOffsetOfPeriod - 1;     END       RETURN @tintWeekOffsetOfPeriod + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_WeekOfMonth‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_WeekOfMonth; END GO   --================================== -- 功能: 获取指定的日期时间所在当前月的周索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3、4、5 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @tintWeekOfMonth = dbo.ufn_WeekOfMonth(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_WeekOfMonth (     @dtmDate DATETIME ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE @tintWeekOffsetOfMonth AS TINYINT;     SET @tintWeekOffsetOfMonth = DATEDIFF(WEEK, dbo.ufn_BasedateOfMonth(@dtmDate), @dtmDate);       IF dbo.ufn_DayOfWeek(@dtmDate) = 7 AND @tintWeekOffsetOfMonth >= 1     BEGIN         SET @tintWeekOffsetOfMonth = @tintWeekOffsetOfMonth - 1;     END       RETURN @tintWeekOffsetOfMonth + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_WeekOfQuarter‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_WeekOfQuarter; END GO   --================================== -- 功能: 获取指定的日期时间所在当前季的周索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,包括1、2、3、4、5、6、7、7、……。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @tintWeekOfQuarter = dbo.ufn_WeekOfQuarter(‘2016-01-11‘) --================================== CREATE FUNCTION dbo.ufn_WeekOfQuarter (     @dtmDate DATETIME ) RETURNS TINYINT     --$Encode$-- BEGIN     DECLARE @tintWeekOffsetOfQuarter AS TINYINT;     SET @tintWeekOffsetOfQuarter = DATEDIFF(WEEK, dbo.ufn_BasedateOfQuarter(@dtmDate), @dtmDate);       IF dbo.ufn_DayOfWeek(@dtmDate) = 7 AND @tintWeekOffsetOfQuarter >= 1     BEGIN         SET @tintWeekOffsetOfQuarter = @tintWeekOffsetOfQuarter - 1;     END       RETURN @tintWeekOffsetOfQuarter + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_WeekOfYear‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_WeekOfYear; END GO   --================================== -- 功能: 获取指定日期属于当前年的周索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,一年最多1-53周。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_WeekOfYear(‘2016-01-07‘); --================================== CREATE FUNCTION dbo.ufn_WeekOfYear (     @dtmDate DATETIME ) RETURNS TINYINT     --$Encode$-- AS BEGIN     DECLARE @tintWeekOffsetOfYear AS TINYINT;     SET @tintWeekOffsetOfYear = DATEDIFF(WEEK, dbo.ufn_BasedateOfYear(@dtmDate), @dtmDate);       IF dbo.ufn_DayOfWeek(@dtmDate) = 7 AND @tintWeekOffsetOfYear >= 1     BEGIN         SET @tintWeekOffsetOfYear = @tintWeekOffsetOfYear - 1;     END       RETURN @tintWeekOffsetOfYear + 1; END GO   IF OBJECT_ID(N‘dbo.ufn_WeekOfDate‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_WeekOfDate; END GO   --================================== -- 功能: 获取指定日期属于当前日历的周索引 -- 说明: 运行在SQL Server 2008+。 --       结果值从1开始计数,包括1、2、3、4、……。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SELECT dbo.ufn_WeekOfDate(‘2016-01-07‘); --================================== CREATE FUNCTION dbo.ufn_WeekOfDate (     @dtmDate DATETIME ) RETURNS INT     --$Encode$-- AS BEGIN     DECLARE @intWeekOffsetOfDate AS INT;     SET @intWeekOffsetOfDate = DATEDIFF(WEEK, dbo.ufn_GetMinDateTime(), @dtmDate);       IF (@@DATEFIRST + DATEPART(WEEKDAY, @dtmDate)) % 7 = 1 AND @intWeekOffsetOfDate >= 1     BEGIN         SET @intWeekOffsetOfDate = @intWeekOffsetOfDate - 1;     END       RETURN @intWeekOffsetOfDate + 1; END GO   -- Test Code DECLARE @dtmDate AS DATETIME; SET @dtmDate = ‘2016-01-15‘;   SELECT     @dtmDate AS ‘The Current Date‘     ,dbo.ufn_Weeks(@dtmDate) AS ‘Weeks‘     ,dbo.ufn_Weeks2Date(dbo.ufn_Weeks(@dtmDate)) AS ‘Date Mapping Weeks‘     ,dbo.ufn_WeekOfPeriod(@dtmDate) AS ‘Week Of The Current Period‘     ,dbo.ufn_WeekOfMonth(@dtmDate) AS ‘Week Of The Current Month‘     ,dbo.ufn_WeekOfQuarter(@dtmDate) AS ‘Week Of The Current Quarter‘     ,dbo.ufn_WeekOfYear(@dtmDate) AS ‘Week Of The Current Year‘     ,dbo.ufn_WeekOfDate(@dtmDate) AS ‘Week Of The Current Date‘;   SET @dtmDate = ‘2016-01-31‘;   SELECT     @dtmDate AS ‘The Current Date‘     ,dbo.ufn_Weeks(@dtmDate) AS ‘Weeks‘     ,dbo.ufn_Weeks2Date(dbo.ufn_Weeks(@dtmDate)) AS ‘Date Mapping Weeks‘     ,dbo.ufn_WeekOfPeriod(@dtmDate) AS ‘Week Of The Current Period‘     ,dbo.ufn_WeekOfMonth(@dtmDate) AS ‘Week Of The Current Month‘     ,dbo.ufn_WeekOfQuarter(@dtmDate) AS ‘Week Of The Current Quarter‘     ,dbo.ufn_WeekOfYear(@dtmDate) AS ‘Week Of The Current Year‘     ,dbo.ufn_WeekOfDate(@dtmDate) AS ‘Week Of The Current Date‘; GO   测试以上函数的效果,如下图: 技术分享 技术分享     旬时间粒度有关函数,T-SQL代码如下: IF OBJECT_ID(N‘dbo.ufn_PeriodOfMonth‘, ‘FN‘) IS NOT NULL BEGIN     DROP FUNCTION dbo.ufn_PeriodOfMonth; END GO   --================================== -- 功能: 获得指定日期时间在当前月的旬索引 -- 说明: 运行在SQL Server 2005+。 --       结果值从1开始计数,1、2、3分别对应上、中、下的旬索引。 -- 作者: XXX -- 创建: yyyy-MM-dd -- 修改: yyyy-MM-dd XXX 修改内容描述 -- 调用: SET @intPeriods = dbo.ufn_PeriodOfMonth(‘2008-01-14‘) --================================== CREATE FUNCTION [dbo].[ufn_PeriodOfMonth]  (     @dtmDate DATETIME            -- 指定的日期时间 ) RETURNS TINYINT     --$Encode$-- AS BEGIN     --当前月的日索引,从1开始计数,,包括1、2、3、……、28、29、30、31     DECLARE @tintDayOfMonth AS TINYINT; &n

人气教程排行