前两天突然冒出通过已知周天,周,年转换为具体日期的想法,花了大概一个小时琢磨了一下。这也是从事数据库这份工作的第三个年头,每天Select ,Update,Delete 表中的数据,然后就是 Alert 、Create PROCEDURE\View 来满足内、外部业务上的需求;同时这也是我的第一份博客,如有不准确的地方欢迎指出,详细代码如下勿喷。
CREATE FUNCTION [dbo].[WeekDayAndWeekChangeDate]
(
@WeekDay INT ,--周天 1-7 星期天=1 以此类推
@Week INT ,--周 一年最多为52周
@Year NVARCHAR(4) --年
)
RETURNS NVARCHAR(50)
AS
BEGIN
DECLARE @StartDate DATETIME = CONVERT(DATETIME,@Year + '-01-01') --每的第一天
DECLARE @Num INT --每年第一天的周天
DECLARE @Date DATETIME
DECLARE @Message NVARCHAR(50)
SET @Num = DATEPART(WEEKDAY,@StartDate)
IF ISNULL(@WeekDay,0) < 0 OR ISNULL(@WeekDay,0) > 7
BEGIN
SET @Message = 'WeekDay 必须大于0 小于 8.'
RETURN @Message
END
IF ISNULL(@Week,0) > 52
BEGIN
SET @Message = 'Week 必须大于0 小于 52'
RETURN @Message
END
--DATEADD(DD,@Week * 7,@StartDate):算[****-01-01]第一周第一天为周天1的最大日期
--DATEADD(DD,-(@Num),DATEADD(DD,@Week * 7,@StartDate)): 算实际当前周的最大日期
--DATEADD(DD,(-7+@WeekDay) ,DATEADD(DD,-(@Num),DATEADD(DD,@Week * 7,@StartDate))):把当前周最大日期向后推一周,然后在加上当前周天
SET @Date=DATEADD(DD,(-7+@WeekDay) ,DATEADD(DD,-(@Num),DATEADD(DD,@Week * 7,@StartDate)))
RETURN CONVERT(NVARCHAR(20),@Date,120)
END