本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
1 个评论
也思考许久,也算是模拟了sql server 中的datepart(week,@dtmDate)这个功能,将@@datefirst这个全局变量作为变量的参数来处理,可以动态指定一周的第一天的索引值(索引值从1开始计数,下同)。仅仅实现了功能而已,没有进行面向对象的单一职责的封装。大致实现思路如下:
1、根据指定日期和一周第一天索引值来获取指定日期在当前周的日索引值;
2、在获取指定日期当前年的第一天和当前年的第一周第一天;
3、根据指定日期、当前年的第一天、当前年的第一周第一天这三个日期进行逻辑处理判定:
3.1、如果指定日期大于等于当前年的第一天且指定日期小于当前年的第一周第一天时,当前星期索引数默认为1。
3.2、第一步:3.1的否定为真时,则计算指定日期与当前年的第一周第一天的日时刻粒度的间隔出于7在默认加上1;
第二步:如果当前年的第一天小于当前年的第一周第一天时,3.2第一步的结果值在加上1即可。
具体的代码实现如下:
IF OBJECT_ID(N'[dbo].[ufn_WeekOfYear]', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[ufn_WeekOfYear];
END
GO
--==================================
-- 功能: 获取指定日期所在当前年中的星期索引值(索引值从1开始计数,大致表示为1、2、3、……、51、52、53)
-- 说明: 具体实现阐述
-- 创建: 2016-07-05 21:40-22:40 剑走江湖 实现功能
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE FUNCTION [dbo].[ufn_WeekOfYear]
(
@dtmDate AS DATETIME ---指定日期
,@tntDateFirst AS TINYINT = 1 --一周第一天(1、2、3、……、7分别对应周一、周二、周三、……、周日),默认为周一为一周第一天
) RETURNS TINYINT
AS
BEGIN
--一周第一天参数逻辑处理
IF (@tntDateFirst IS NULL OR @tntDateFirst = 0 OR @tntDateFirst NOT BETWEEN 1 AND 7)
BEGIN
SET @tntDateFirst = 1;
END
--声明当前年星期索引的变量,且赋值为1(表示当前年第一周)
DECLARE @tntWeekOfYear AS TINYINT;
SET @tntWeekOfYear = 1;
--声明当前年的第一天的变量且赋值
DECLARE @dtmFirstDayOfYear AS DATETIME;
SET @dtmFirstDayOfYear = DATEADD(YEAR, DATEDIFF(YEAR, 0, @dtmDate), 0);
--声明当前年的第一周第一天的变量,且赋值为当前年的第一天
DECLARE @dtmFirstWeekFirstDayOfYear AS DATETIME;
SET @dtmFirstWeekFirstDayOfYear = @dtmFirstDayOfYear;
--声明开始日期和结束日期变量且赋值主要用来获取当前周的
DECLARE
@dtmStartDate AS DATETIME
,@dtmEndDate AS DATETIME;
SELECT
@dtmStartDate = @dtmFirstDayOfYear
,@dtmEndDate = DATEADD(DAY, 7, @dtmFirstDayOfYear);
--获取当前年的第一周第一天的算法实现
WHILE (@dtmStartDate <= @dtmEndDate)
BEGIN
--获取指定日期所在当前周的日索引值(索引值从1开始计数,1、2、3、……、6、7分别对应周一、周二、周三、……、周六、周日)
--使用(@@datefirt + datepart(weekday, @dtmDate))%7的结果值从2、3、4、5、6、0、1
--分别对应周一、周二、周三、周四、周五、周六、周日
DECLARE @tntDayOfWeek AS TINYINT;
SET @tntDayOfWeek = 1;
DECLARE @tntRemainder AS TINYINT;
SET @tntRemainder = (@@DATEFIRST + DATEPART(WEEKDAY, @dtmStartDate)) % 7;
SET @tntDayOfWeek = CASE WHEN @tntRemainder <= 1 THEN @tntRemainder + 6 ELSE @tntRemainder - 1 END;
IF (@tntDayOfWeek = @tntDateFirst)
BEGIN
SET @dtmFirstWeekFirstDayOfYear = @dtmStartDate;
BREAK;
END
SET @dtmStartDate = DATEADD(DAY, 1, @dtmStartDate);
END
--获取当前年的星期索引的算法实现
IF NOT(@dtmDate >= @dtmFirstDayOfYear AND @dtmDate < @dtmFirstWeekFirstDayOfYear)
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + DATEDIFF(DAY, @dtmFirstWeekFirstDayOfYear, @dtmDate) / 7;
IF(@dtmFirstDayOfYear < @dtmFirstWeekFirstDayOfYear)
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + 1;
END
END
RETURN @tntWeekOfYear;
END
GO
测试代码你测试哈,这个实现楼主可以继续分解和封装一下函数:
1、获取指定日期当前年的第一天的函数。
2、获取指定日期当前周的日索引数函数。
3、获取指定日期当前年的第一周第一天的函数。
以上分解每个功能比较单一,也很容易维护。
测试代码就不写啦,希望能帮助到楼主。
1、根据指定日期和一周第一天索引值来获取指定日期在当前周的日索引值;
2、在获取指定日期当前年的第一天和当前年的第一周第一天;
3、根据指定日期、当前年的第一天、当前年的第一周第一天这三个日期进行逻辑处理判定:
3.1、如果指定日期大于等于当前年的第一天且指定日期小于当前年的第一周第一天时,当前星期索引数默认为1。
3.2、第一步:3.1的否定为真时,则计算指定日期与当前年的第一周第一天的日时刻粒度的间隔出于7在默认加上1;
第二步:如果当前年的第一天小于当前年的第一周第一天时,3.2第一步的结果值在加上1即可。
具体的代码实现如下:
IF OBJECT_ID(N'[dbo].[ufn_WeekOfYear]', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[ufn_WeekOfYear];
END
GO
--==================================
-- 功能: 获取指定日期所在当前年中的星期索引值(索引值从1开始计数,大致表示为1、2、3、……、51、52、53)
-- 说明: 具体实现阐述
-- 创建: 2016-07-05 21:40-22:40 剑走江湖 实现功能
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE FUNCTION [dbo].[ufn_WeekOfYear]
(
@dtmDate AS DATETIME ---指定日期
,@tntDateFirst AS TINYINT = 1 --一周第一天(1、2、3、……、7分别对应周一、周二、周三、……、周日),默认为周一为一周第一天
) RETURNS TINYINT
AS
BEGIN
--一周第一天参数逻辑处理
IF (@tntDateFirst IS NULL OR @tntDateFirst = 0 OR @tntDateFirst NOT BETWEEN 1 AND 7)
BEGIN
SET @tntDateFirst = 1;
END
--声明当前年星期索引的变量,且赋值为1(表示当前年第一周)
DECLARE @tntWeekOfYear AS TINYINT;
SET @tntWeekOfYear = 1;
--声明当前年的第一天的变量且赋值
DECLARE @dtmFirstDayOfYear AS DATETIME;
SET @dtmFirstDayOfYear = DATEADD(YEAR, DATEDIFF(YEAR, 0, @dtmDate), 0);
--声明当前年的第一周第一天的变量,且赋值为当前年的第一天
DECLARE @dtmFirstWeekFirstDayOfYear AS DATETIME;
SET @dtmFirstWeekFirstDayOfYear = @dtmFirstDayOfYear;
--声明开始日期和结束日期变量且赋值主要用来获取当前周的
DECLARE
@dtmStartDate AS DATETIME
,@dtmEndDate AS DATETIME;
SELECT
@dtmStartDate = @dtmFirstDayOfYear
,@dtmEndDate = DATEADD(DAY, 7, @dtmFirstDayOfYear);
--获取当前年的第一周第一天的算法实现
WHILE (@dtmStartDate <= @dtmEndDate)
BEGIN
--获取指定日期所在当前周的日索引值(索引值从1开始计数,1、2、3、……、6、7分别对应周一、周二、周三、……、周六、周日)
--使用(@@datefirt + datepart(weekday, @dtmDate))%7的结果值从2、3、4、5、6、0、1
--分别对应周一、周二、周三、周四、周五、周六、周日
DECLARE @tntDayOfWeek AS TINYINT;
SET @tntDayOfWeek = 1;
DECLARE @tntRemainder AS TINYINT;
SET @tntRemainder = (@@DATEFIRST + DATEPART(WEEKDAY, @dtmStartDate)) % 7;
SET @tntDayOfWeek = CASE WHEN @tntRemainder <= 1 THEN @tntRemainder + 6 ELSE @tntRemainder - 1 END;
IF (@tntDayOfWeek = @tntDateFirst)
BEGIN
SET @dtmFirstWeekFirstDayOfYear = @dtmStartDate;
BREAK;
END
SET @dtmStartDate = DATEADD(DAY, 1, @dtmStartDate);
END
--获取当前年的星期索引的算法实现
IF NOT(@dtmDate >= @dtmFirstDayOfYear AND @dtmDate < @dtmFirstWeekFirstDayOfYear)
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + DATEDIFF(DAY, @dtmFirstWeekFirstDayOfYear, @dtmDate) / 7;
IF(@dtmFirstDayOfYear < @dtmFirstWeekFirstDayOfYear)
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + 1;
END
END
RETURN @tntWeekOfYear;
END
GO
测试代码你测试哈,这个实现楼主可以继续分解和封装一下函数:
1、获取指定日期当前年的第一天的函数。
2、获取指定日期当前周的日索引数函数。
3、获取指定日期当前年的第一周第一天的函数。
以上分解每个功能比较单一,也很容易维护。
测试代码就不写啦,希望能帮助到楼主。